如何使用 Camel 客户端和 IBMMQ 代理设置 JMSCorrelationID 并与 JMSMessageID 关联

问题描述

我有一个使用 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}")