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

时间:2012-11-29 20:56:57

标签: jms activemq apache-camel

我正在使用Apache Camel DSL并试图弄清楚如何路由消息,就像这样。这是逻辑,没有任何Camel DSL。

  • 消息进入队列
  • 调用bean
  • 如果bean没有异常
    • 使用原始消息调用另一个bean

我的问题是我不确定如何使用原始邮件进入步骤3.a.对bean的调用会更改消息。我可以使用多播,两个管道和标头变量,但从我可以看出这些标头变量在管道范围内。

任何想法都表示赞赏!谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

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

您可以在此处阅读有关多播EIP的信息:http://camel.apache.org/multicast.html

答案 1 :(得分:1)

来自你的第二个bean的

,只需致电exchange.getUnitOfWork().getOriginalInMessage()

答案 2 :(得分:0)

我最终将消息内容存储在变量中,并在消息更改后将消息设置回该内容,如此...

<!-- 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>

....根据该输出设置一堆变量,然后

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