问题描述
我有一个使用 JMS 组件连接 IBMMQ 的 Camel 客户端。
我需要
- 发送具有固定值的 JMSCorrelationID。
- 通过 JMSMessageID 关联回复消息。
我的配置是:
.setHeader("CamelJmsDestinationName","queue:///requestQueue.AQ?targetClient=1")
.setHeader("JMSCorrelationID","SomeValue")
.to("jms:queue:requestQueue.AQ?useMessageIDAsCorrelationID=true&replyTo=ResponseQueue")
问题是当 useMessageIDAsCorrelationID=true 时 JMSCorrelationID 为 null
JMSMessageID: ID:c3e2d840d8d4e3f14040404040404040d95c7873193bef06
JMSTimestamp: 1614870096440
JMSCorrelationID: null
当 useMessageIDAsCorrelationID=false 时,JMSCorrelationID 按预期设置,但相关超时。如何使用两者?
解决方法
为了解决这个问题,我对 .to() 端点选项进行了以下更改:
- exchangePattern=InOnly
- includeSentJMSMessageID=true
然后使用 JMSCorrelationID 发送消息,但无需等待回复。此后,我使用由 JMS 选择器过滤的代理创建的 JMSMessageID 使用简单表达式动态设置 pollEnrich():
- selector=JMSMessageID='${header.JMSMessageID}
骆驼路线:
.setHeader("CamelJmsDestinationName","queue:///requestQueue.AQ?targetClient=1")
.setHeader("JMSCorrelationID","SomeValue")
.to("jms://RequestQueue?useMessageIDAsCorrelationID=false&exchangePattern=InOnly&replyTo=ReplyQueue&includeSentJMSMessageID=true")
.pollEnrich().simple("jms://ReplyQueue?selector=JMSMessageID='${header.JMSMessageID}').timeout(20000)
.log("${body}")