Camel route1用于向route2发送消息,route2确实处理消息并处理中间 将回复发送回route1 ,但将继续处理。你会如何实现这种模式?
这里考虑的选择很少:
选项1
请参考此图表:
以下是我目前正在测试的方式。
<route id="route1">
<from uri="direct:test-queue" />
<log message="Start test. Body :: ${body}" />
<setHeader headerName="JMSCorrelationID">
<constant>JMS_TEST</constant>
</setHeader>
<to uri="activemq:queue:jms.test.queue.request?
replyToType=Exclusive
&replyTo=jms.test.queue.reply
&useMessageIDAsCorrelationID=false" pattern="InOut" />
<log message="Body is now :: ${body}" />
</route>
<route id="route2">
<from uri="activemq:queue:jms.test.queue.request" />
<setBody>
<constant>TEST! (Correct body).</constant>
</setBody>
<to uri="activemq:queue:jms.test.queue.reply" pattern="InOnly" />
<setBody>
<constant>Wrong body...</constant>
</setBody>
<log message="Continue processing..." />
</route>
这似乎有效,但会发出警告:
QueueReplyManager - org.apache.camel.camel-jms - 2.16.2 | Reply received for
unknown correlationID [JMS_TEST]
on reply destination [queue://jms.test.queue.reply]. Current correlation map
size: 0. The message will be ignored:
ActiveMQTextMessage {commandId = 4175, responseRequired = true, messageId =
<cut> text = Wrong body...}
当route2到达终点时,它还会向reply-channel发送新的回复,这会导致警告。
更好的方法吗?我想如果没有使用camel-jms警告,这是不可行的,因为JMSReplyTo无法动态更改。
选项2
此处here提出了类似但不一样的问题。区别在于路由2应该在某些条件下停止路由。提供的解决方案不适用于此处,因为它创建了一个新线程。问题是如果调用route2(例如通过routeX),则调用者不会从route3获得预期的回复。在某些情况下仍然可以使用它,但是我不喜欢窃听,而是选择ActiveMQ,因为它序列化/反序列化了对象,因此可以免费创建深层拷贝。使用窃听,应首先实现onPrepareRef以创建深层副本。见下图:
选项3:
还有另一种方法可以做到这一点。它需要更多的工作,但提供完全控制。请考虑下图:
我还没有实施这个选项,因为选项1可以运行得很好。但是,使用这个选项3我没有看到任何潜在的问题,因为实现非常简单。