处理过程中的Camel请求+回复并继续处理

时间:2017-06-06 13:10:11

标签: design-patterns apache-camel jms activemq receipt

Camel route1用于向route2发送消息,route2确实处理消息并处理中间 将回复发送回route1 ,但将继续处理。你会如何实现这种模式?

这里考虑的选择很少:

选项1

请参考此图表:

diagram

以下是我目前正在测试的方式。

<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
        &amp;replyTo=jms.test.queue.reply
        &amp;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以创建深层副本。见下图:

new thread

选项3:

还有另一种方法可以做到这一点。它需要更多的工作,但提供完全控制。请考虑下图:enter image description here

我还没有实施这个选项,因为选项1可以运行得很好。但是,使用这个选项3我没有看到任何潜在的问题,因为实现非常简单。

0 个答案:

没有答案