【发布时间】:2018-05-16 23:44:15
【问题描述】:
我很困惑 Camel 在使用消息队列时如何自动形成消息和相关标识符。
例如,我有两个具有以下路线的服务
<route id="cxfToJMSRoute">
<from uri="cxf:bean:endpoint" />
<convertBodyTo type="String" />
<log message="..." />
<log message="In message: ${in.body}" />
<log message="In JMSMessageID: ${in.header.JMSMessageID}" />
<log message="In JMSCorrelationID: ${in.header.JMSCorrelationID}" />
<log message="Out message: ${out.body}" />
<log message="Out JMSMessageID: ${out.header.JMSMessageID}" />
<log message="Out JMSCorrelationID: ${out.header.JMSCorrelationID}" />
<log message="Invoking service A by sending InOut message to api queue" />
<to uri="activemq:queue:api?replyTo=result&replyToType=Exclusive"
pattern="InOut" />
<log message="..." />
<log message="Got message from Service A" />
<log message="In message: ${in.body}" />
<log message="In JMSMessageID: ${in.header.JMSMessageID}" />
<log message="In JMSCorrelationID: ${in.header.JMSCorrelationID}" />
<log message="Out message: ${out.body}" />
<log message="Out JMSMessageID: ${out.header.JMSMessageID}" />
<log message="Out JMSCorrelationID: ${out.header.JMSCorrelationID}" />
<!-- Correlation ID? -->
<pollEnrich>
<constant>activemq:queue:reply</constant>
</pollEnrich>
<log message="..." />
<log message="Got message from Service B" />
<log message="In message: ${in.body}" />
<log message="In JMSMessageID: ${in.header.JMSMessageID}" />
<log message="In JMSCorrelationID: ${in.header.JMSCorrelationID}" />
<log message="Out message: ${out.body}" />
<log message="Out JMSMessageID: ${out.header.JMSMessageID}" />
<log message="Out JMSCorrelationID: ${out.header.JMSCorrelationID}" />
<transform>
<simple>${in.body}</simple>
</transform>
<log message="After transform:" />
<log message="In message: ${in.body}" />
<log message="In JMSMessageID: ${in.header.JMSMessageID}" />
<log message="In JMSCorrelationID: ${in.header.JMSCorrelationID}" />
<log message="Out message: ${out.body}" />
<log message="Out JMSMessageID: ${out.header.JMSMessageID}" />
<log message="Out JMSCorrelationID: ${out.header.JMSCorrelationID}" />
<log message="..." />
</route>
--
<route id="apiToServiceARoute">
<from uri="activemq:queue:api"/>
<log message="..." />
<log message="In message: ${in.body}" />
<log message="In JMSMessageID: ${in.header.JMSMessageID}" />
<log message="In JMSCorrelationID: ${in.header.JMSCorrelationID}" />
<log message="Out message: ${out.body}" />
<log message="Out JMSMessageID: ${out.header.JMSMessageID}" />
<log message="Out JMSCorrelationID: ${out.header.JMSCorrelationID}" />
<log message="Mocking service B by sending InOnly message to reply queue" />
<to uri="activemq:queue:reply?exchangePattern=InOnly" pattern="InOnly" />
<transform>
<simple>Delegated</simple>
</transform>
<log message="..." />
<log message="After transform:" />
<log message="In message: ${in.body}" />
<log message="In JMSMessageID: ${in.header.JMSMessageID}" />
<log message="In JMSCorrelationID: ${in.header.JMSCorrelationID}" />
<log message="Out message: ${out.body}" />
<log message="Out JMSMessageID: ${out.header.JMSMessageID}" />
<log message="Out JMSCorrelationID: ${out.header.JMSCorrelationID}" />
<log message="..." />
</route>
这是我根据日志消息的观察结果
-
OUT消息始终为空。 Camel 是否总是默认使用IN,直到OUT被某些处理器明确创建? -
JMSMessageID和JMSCorrelationID似乎没有任何联系。 Camel 是否仅使用JMSCorrelationID来关联消息? - Camel 在将
InOnly消息发送到请求来源的另一个队列(回复)时设法保留JMSCorrelationID。这是可取的,但它实际上是如何做到的呢?保留JMSCorrelationID的具体规则是什么?
这是两个示例路线的实际日志
2017-12-03 12:16:06.197 INFO 13780 --- [qtp335580595-36] cxfToJMSRoute : ...
2017-12-03 12:16:06.197 INFO 13780 --- [qtp335580595-36] cxfToJMSRoute : In message: testi2
2017-12-03 12:16:06.198 INFO 13780 --- [qtp335580595-36] cxfToJMSRoute : In JMSMessageID:
2017-12-03 12:16:06.198 INFO 13780 --- [qtp335580595-36] cxfToJMSRoute : In JMSCorrelationID:
2017-12-03 12:16:06.198 INFO 13780 --- [qtp335580595-36] cxfToJMSRoute : Out message:
2017-12-03 12:16:06.198 INFO 13780 --- [qtp335580595-36] cxfToJMSRoute : Out JMSMessageID:
2017-12-03 12:16:06.198 INFO 13780 --- [qtp335580595-36] cxfToJMSRoute : Out JMSCorrelationID:
2017-12-03 12:16:06.198 INFO 13780 --- [qtp335580595-36] cxfToJMSRoute : Invoking service A by sending InOut message to api queue
2017-12-03 12:16:06.569 INFO 13780 --- [Manager[result]] cxfToJMSRoute : ...
2017-12-03 12:16:06.570 INFO 13780 --- [Manager[result]] cxfToJMSRoute : Got message from Service A
2017-12-03 12:16:06.570 INFO 13780 --- [Manager[result]] cxfToJMSRoute : In message: Delegated
2017-12-03 12:16:06.582 INFO 13780 --- [Manager[result]] cxfToJMSRoute : In JMSMessageID: ID:DESKTOP-LI5P50P-54036-1512296151920-1:1:1:1:1
2017-12-03 12:16:06.582 INFO 13780 --- [Manager[result]] cxfToJMSRoute : In JMSCorrelationID: Camel-ID-DESKTOP-LI5P50P-1512296077166-0-2
2017-12-03 12:16:06.582 INFO 13780 --- [Manager[result]] cxfToJMSRoute : Out message:
2017-12-03 12:16:06.582 INFO 13780 --- [Manager[result]] cxfToJMSRoute : Out JMSMessageID:
2017-12-03 12:16:06.583 INFO 13780 --- [Manager[result]] cxfToJMSRoute : Out JMSCorrelationID:
2017-12-03 12:16:06.596 INFO 13780 --- [Manager[result]] cxfToJMSRoute : ...
2017-12-03 12:16:06.596 INFO 13780 --- [Manager[result]] cxfToJMSRoute : Got message from Service B
2017-12-03 12:16:06.596 INFO 13780 --- [Manager[result]] cxfToJMSRoute : In message: testi2
2017-12-03 12:16:06.597 INFO 13780 --- [Manager[result]] cxfToJMSRoute : In JMSMessageID: ID:DESKTOP-LI5P50P-54036-1512296151920-3:1:1:1:1
2017-12-03 12:16:06.597 INFO 13780 --- [Manager[result]] cxfToJMSRoute : In JMSCorrelationID: Camel-ID-DESKTOP-LI5P50P-1512296077166-0-2
2017-12-03 12:16:06.597 INFO 13780 --- [Manager[result]] cxfToJMSRoute : Out message:
2017-12-03 12:16:06.597 INFO 13780 --- [Manager[result]] cxfToJMSRoute : Out JMSMessageID:
2017-12-03 12:16:06.597 INFO 13780 --- [Manager[result]] cxfToJMSRoute : Out JMSCorrelationID:
2017-12-03 12:16:06.598 INFO 13780 --- [Manager[result]] cxfToJMSRoute : After transform:
2017-12-03 12:16:06.598 INFO 13780 --- [Manager[result]] cxfToJMSRoute : In message: testi2
2017-12-03 12:16:06.598 INFO 13780 --- [Manager[result]] cxfToJMSRoute : In JMSMessageID: ID:DESKTOP-LI5P50P-54036-1512296151920-3:1:1:1:1
2017-12-03 12:16:06.598 INFO 13780 --- [Manager[result]] cxfToJMSRoute : In JMSCorrelationID: Camel-ID-DESKTOP-LI5P50P-1512296077166-0-2
2017-12-03 12:16:06.598 INFO 13780 --- [Manager[result]] cxfToJMSRoute : Out message:
2017-12-03 12:16:06.598 INFO 13780 --- [Manager[result]] cxfToJMSRoute : Out JMSMessageID:
2017-12-03 12:16:06.598 INFO 13780 --- [Manager[result]] cxfToJMSRoute : Out JMSCorrelationID:
2017-12-03 12:16:06.598 INFO 13780 --- [Manager[result]] cxfToJMSRoute : ...
--
2017-12-03 12:16:06.528 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : ...
2017-12-03 12:16:06.531 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : In message: testi2
2017-12-03 12:16:06.534 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : In JMSMessageID: ID:DESKTOP-LI5P50P-54046-1512296166309-1:1:2:1:1
2017-12-03 12:16:06.534 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : In JMSCorrelationID: Camel-ID-DESKTOP-LI5P50P-1512296077166-0-2
2017-12-03 12:16:06.534 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : Out message:
2017-12-03 12:16:06.535 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : Out JMSMessageID:
2017-12-03 12:16:06.535 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : Out JMSCorrelationID:
2017-12-03 12:16:06.535 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : Mocking service B by sending InOnly message to reply queue
2017-12-03 12:16:06.558 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : ...
2017-12-03 12:16:06.558 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : After transform:
2017-12-03 12:16:06.558 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : In message: Delegated
2017-12-03 12:16:06.558 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : In JMSMessageID: ID:DESKTOP-LI5P50P-54046-1512296166309-1:1:2:1:1
2017-12-03 12:16:06.559 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : In JMSCorrelationID: Camel-ID-DESKTOP-LI5P50P-1512296077166-0-2
2017-12-03 12:16:06.559 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : Out message:
2017-12-03 12:16:06.559 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : Out JMSMessageID:
2017-12-03 12:16:06.559 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : Out JMSCorrelationID:
2017-12-03 12:16:06.559 INFO 16972 --- [msConsumer[api]] apiToServiceARoute : ...
【问题讨论】:
-
它几乎总是基于correlationId。在 IBM MQ 和 RabbitMQ 中也是如此。
标签: apache-camel jms activemq integration messaging