Jms 如何使用ApacheCamel来适应这种消息传递逻辑?

Jms 如何使用ApacheCamel来适应这种消息传递逻辑?,jms,activemq,apache-camel,Jms,Activemq,Apache Camel,我正在使用ApacheCamel DSL,并试图找出如何路由消息,如下所示。这里的逻辑,没有任何骆驼DSL 消息进入队列 呼叫豆 如果bean没有异常 使用原始消息调用另一个bean 我的问题是,我不确定如何使用原始消息进入步骤3.a。对bean的调用会更改消息。我可以使用一个多播、两个管道和头变量,但从我所知道的情况来看,这些头变量在管道的作用域内 任何想法都很感激!谢谢 从第二个bean调用exchange.getUnitOfWork().getOriginalMessage()从第

我正在使用ApacheCamel DSL,并试图找出如何路由消息,如下所示。这里的逻辑,没有任何骆驼DSL

  • 消息进入队列
  • 呼叫豆
  • 如果bean没有异常
    • 使用原始消息调用另一个bean
我的问题是,我不确定如何使用原始消息进入步骤3.a。对bean的调用会更改消息。我可以使用一个多播、两个管道和头变量,但从我所知道的情况来看,这些头变量在管道的作用域内


任何想法都很感激!谢谢

从第二个bean调用
exchange.getUnitOfWork().getOriginalMessage()

从第二个bean调用
exchange.getUnitOfWork().getOriginalMessage()

您可以在顺序模式下使用多播eip

<from uri="somewhere"/>
<multicast>
  <to uri="bean:beanA"/>
  <to uri="bean:beanB"/>
</multicast>

默认情况下,多播以顺序模式运行,因此首先调用beanA。如果这是成功的,它调用beanB,但是使用原始消息(我们称之为beanA的同一消息的副本)


您可以在此处阅读有关多播EIP的信息:

您可以在顺序模式下使用多播EIP

<from uri="somewhere"/>
<multicast>
  <to uri="bean:beanA"/>
  <to uri="bean:beanB"/>
</multicast>

默认情况下,多播以顺序模式运行,因此首先调用beanA。如果这是成功的,它调用beanB,但是使用原始消息(我们称之为beanA的同一消息的副本)


您可以在此处阅读有关多播EIP的信息:

我将消息的内容存储在一个变量中,并在更改后将消息设置回该内容,如下所示

<!-- store original content in header variable -->
<camel:setHeader headerName="marc"><camel:simple>${body}</camel:simple></camel:setHeader>
<!-- run some logic, output gets saved as another header variable, message as this point is now that output -->
<camel:bean ref="getPidsForUpdate"/>
<camel:setHeader headerName="pids"><camel:simple>${body}</camel:simple></camel:setHeader>

${body}
${body}
..基于该输出设置一组变量,然后

<!-- get original message to run some more logic-->
<camel:setBody><camel:simple>${headers.marc}</camel:simple></camel:setBody>

${headers.marc}

我最终将消息的内容存储在一个变量中,并在更改后将消息设置回该内容,就像这样

<!-- store original content in header variable -->
<camel:setHeader headerName="marc"><camel:simple>${body}</camel:simple></camel:setHeader>
<!-- run some logic, output gets saved as another header variable, message as this point is now that output -->
<camel:bean ref="getPidsForUpdate"/>
<camel:setHeader headerName="pids"><camel:simple>${body}</camel:simple></camel:setHeader>

${body}
${body}
..基于该输出设置一组变量,然后

<!-- get original message to run some more logic-->
<camel:setBody><camel:simple>${headers.marc}</camel:simple></camel:setBody>

${headers.marc}

谢谢。不过,我的bean不做任何路由。我可以在Spring DSL中获得原始消息吗?谢谢。不过,我的bean不做任何路由。我可以在Spring DSL中获得原始消息吗?谢谢。但是,我的bean返回我需要在其上运行xsl的输出。这不会覆盖原始消息吗?我现在有一个带有两个管道的多播。我在第一个管道中设置了一些头变量,但在第二个管道中需要它们。然而,它们不在范围之内。我找不到关于这些变量范围的任何信息。有什么想法吗?谢谢。你会返回任何东西吗?如果它是一个void方法,你可以不用多播就直接调用它。那么消息体就不会改变。在beanA中,您仍然可以添加新的标题等,谢谢。但是,我的bean返回我需要在其上运行xsl的输出。这不会覆盖原始消息吗?我现在有一个带有两个管道的多播。我在第一个管道中设置了一些头变量,但在第二个管道中需要它们。然而,它们不在范围之内。我找不到关于这些变量范围的任何信息。有什么想法吗?谢谢。你会返回任何东西吗?如果它是一个void方法,你可以不用多播就直接调用它。那么消息体就不会改变。在beanA中,您仍然可以添加新的标题等。