【问题标题】:setting ReplyToQ attribute of MQMD of IBM MQ request message with Camel使用 Camel 设置 IBM MQ 请求消息的 MQMD 的 ReplyToQ 属性
【发布时间】:2018-07-17 13:12:21
【问题描述】:

我将 Camel 与 Fuse 一起使用,但无法设置 JMSReplyTo。以下是我路线的摘录:

<setHeader headerName="JMSReplyTo" id="_setHeader2">
    <constant>QTEST</constant>
</setHeader>
<setHeader headerName="CamelJmsDestinationName" id="_setHeader1">
    <constant>queue://QM_TEST/SYSTEM.DEFAULT.LOCAL.QUEUE?targetClient=1</constant>
</setHeader>
<to id="_to1" uri="websphere:queue:SYSTEM.DEFAULT.LOCAL.QUEUE?replyTo=QTEST"/>

我以这里给出的代码为例: Implementing native websphere MQ with CoD over Camel JMS component 起初,我认为这是因为我在 CamelJmsDestinationName 标头中设置了 targetClient=1 指令删除了不需要的 jms 标头,但即使没有它,它也不会为 MQMD 的 ReplyToQ 属性设置任何内容。我也试过这里给出的建议How to send message to different Queue hosted in different queue manager and hostname in IBM MQ cluster,但这对我也不起作用,就是这样:

queue://QM_TEST/QTEST?mdReadEnabled=true&amp;messageBody=0&amp;mdWriteEnabled=true&amp;XMSC_WMQ_REPLYTO_STYLE=1&amp;targetClient=1

问题是为什么它不起作用?

【问题讨论】:

  • 您能否更具体地说明什么不起作用? MQMD 和 MQRFH2 标头是否正确生成?
  • MQMD 是用空白的ReplyToQ 生成的,我希望它包含用JMSReplyTo 指定的字符串(在此示例中为QTEST)。 MQRFH2 标头的生成取决于 targetClient 是否设置为 1,但它也没有该设置。而且我希望它只在 MQMD 中设置,并避免使用 MQRFH2,这对我来说是一个非常重要的用例。
  • 我认为最好先看看这里的映射概述:ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/…
  • 为什么不想包含 MQRFH2?
  • 当接收 MDB 设置为不期望该标头时,我必须知道如何不包含它。在发帖之前,我已经研究过这些映射。那么,通过查看它们,您建议我应该如何在 MQMD 中设置 ReplyToQ?

标签: apache-camel ibm-mq


【解决方案1】:

我已经弄清楚如何设置ReplyToQ 属性,但这只是我现在面临的问题的一部分。如此处所述,在 JMS Producer 章节中:

http://camel.apache.org/jms.html

只需要这样:

        <setHeader headerName="CamelJmsDestinationName" id="_setHeader1">
            <constant>queue://QMib_TEST/OUTPUTQ?targetClient=1</constant>
        </setHeader>
        <to id="_to1" uri="websphere:queue:SYSTEM.DEFAULT.LOCAL.QUEUE?replyTo=REPLYQ" pattern="InOut"/>

它的作用是将请求消息发送到 OUTPUTQ,然后侦听 REPLYQ,但会匹配一些自动生成的关联 ID。好事是,ReplyToQ 现在在请求消息中设置为 REPLYQ,由于 pattern="InOut" 设置,坏事是在我们的例子中,回复应用程序通过将 Correlation ID 设置为收到请求的消息 ID 进行响应,全部来自 MQMD,并且默认情况下,此 Camel 模式不会在请求的 MQMD 中生成等于它期望的(JMS?)相关 ID 的消息 ID,因此即使将响应放入正确的队列,该响应仍保留在队列中,不被消耗。事实上,它甚至会在 get 等待间隔过后重复发出请求,从而产生更多未在 REPLYQ 中使用的响应消息。所以,这是我必须解决的另一个问题,如何正确处理 MessageID 和 CorrelationID,但我已经解决了这个问题。

【讨论】:

  • 我不明白,响应上的匹配应该是 CorrelationId 而不是 MesageId。 MessageId 只是一些唯一编号。它是确定请求和响应相关的correlationId。应用程序应获取请求相关 ID 并将其设置在响应相关 ID 中。
  • 响应上的匹配是在 CorrelationId 上而不是在 MesageId 上,但是,在我们的例子中,响应应用程序接受请求 MessageId 并将其设置为响应 CorrelationId,因为这是我们案例中的请求应用程序所期望的。这是在 IBM MQ 世界中实现请求回复模式的标准方式,例如,如果您不信任我,请参见此处mqseries.net/phpBB2/viewtopic.php?p=167430,建议使用此类命令:outmsg.setCorrelId(inmsg.getMessageId());跨度>
  • 这是一种实现唯一 CorrelationID 的简单方法,因为 MessageID 的唯一性,这在许多线程使用相同的固定回复队列的情况下很重要。
  • 我认为您需要查看 MQ 文档。 ibm.com/support/knowledgecenter/en/SSFKSJ_7.5.0/… 。您需要始终使用correlationId 字段,以便更轻松地检查请求/响应是否属于一起。每当您将消息放入队列时,都可以生成 MessageIds。
  • 如何设置选项“useMessageIDAsCorrelationID=true”? (默认为假)听起来像你需要的。请参阅 Camel JMS 文档:camel.apache.org/jms.html
猜你喜欢
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 2019-03-24
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多