【问题标题】:Set ReplyToQMgr and ReplyToQ in Apache Camel reout to receive COA using IBM MQ在 Apache Camel reout 中设置 ReplyToQMgr 和 ReplyToQ 以使用 IBM MQ 接收 COA
【发布时间】:2021-10-26 17:47:49
【问题描述】:

我正在使用 Apache Camel 和 IBM MQ 发送消息。当消息被传递到远程队列时,我需要接收 COA。一般图片如下所示:
当消息到达 msg_q2 队列时,我应该收到返回的 COA。所以,问题是我无法将 QMGR_REM 设置为应该生成 COA 的回复队列管理器。 https://www.ibm.com/docs/en/ibm-mq/8.0?topic=messages-reply-queue-queue-manager
我尝试设置 JMS_IBM_MQMD_xxx 标头,但由于某种原因,这些标头要么被省略要么被忽略(被骆驼?),并且由于未指定回复队列的原因,消息未能放入队列。另外,我尝试将 JMSReplyTo 标头设置为queue://reply-to-qmgr/reply-to-q。在这种情况下,queue:// 部分被删除,其余部分被简单地设置为回复队列名称。
我对 Apache Camel 和 IBM MQ 比较陌生,因此非常感谢任何输入。提前谢谢!

【问题讨论】:

  • 为什么需要将 QMGR_REM 设置为对 QMgr 的回复?为什么不确保存在从 QMGR_REM 回到 QMGR_LOC 的路由,以便可以传递发往 QMGR_LOC 上的队列 (replyToQ1) 的消息。那么你的应用程序就不需要做任何复杂的事情了。
  • 因为 QMGR_REM 拥有 replyToQ2,并且队列管理器负责生成 COA(和其他报告消息)。我需要实现此功能以确保将消息成功放入 msg_q2 队列。
  • 我认为您不了解 MQ 的工作原理。如果您在队列管理器“QMGR_REM”中为“QMGR_LOC”创建队列管理器别名,那么如果您指定,MQ 将自动将包括 COA 和 COD 的消息流回正确的队列“QMGR_LOC”的 RemoteQMgrName 和“ReplyToQ1”的 RemoteQName。就是这么简单。你把事情弄得太复杂了。

标签: java apache-camel ibm-mq


【解决方案1】:

在您的应用程序中,只需将您的 ReplyToQ 的名称提供为 replyToQ1 并将 ReplyToQMgr 字段留空。队列管理器将为您填写本地队列管理器名称QMGR_LOC

然后在QMGR_REC 上执行以下操作之一:-

  1. 如果您的从QMGR_REMQMGR_LOC 的通道的传输队列的名称正好是QMGR_LOC,则您无需再做任何事情。当QMGR_REM 将COA 放入队列管理器QMGR_LOC 上的队列replyToQ1 时,它会将其解析为名称为QMGR_LOC 的传输队列,并由通道传递。

  2. 如果从QMGR_REMQMGR_LOC 的通道的传输队列的名称不完全是QMGR_LOC,则在QMGR_REM 上进行以下定义:

DEFINE QREMOTE(QMGR_LOC) RNAME(' ') RQMNAME(QMGR_LOC) +
       XMITQ(your-transmission-queue-going-to-QMGR_LOC)

【讨论】:

    【解决方案2】:

    因此,基本上通过反复试验,我发现在CamelJmsDestinationName Camel 标头上添加mdWriteEnabled=true 属性可以使其按我的需要工作。

    代码是这样的:

    route.setHeader("CamelJmsDestinationName", "queue:///msg_q1?targetClient=1&mdWriteEnabled=true")

    然后我通过 MQMD 属性设置回复队列管理器

    route.setHeader("JMS_IBM_MQMD_ReplyToQMgr", "QMGR_REM")

    和回复队列

    route.setHeader("JMSReplyTo", "replyToQ2")

    【讨论】:

    • 我必须在这里补充一点,这不是使用ReplyQ 的推荐方式。您正在使您的应用程序和配置复杂化。请参阅有关您的问题的 cmets 和提供的其他答案。现在,您的应用程序在不需要时依赖于远程队列管理器上的特定配置。想象一下,这针对多个不同的应用程序和多个不同的队列管理器进行了扩展?
    • @MoragHughson 这样做的一个好处是您只需要将响应应用程序权限授予 QREMOTE 而不是 XMITQ。想象一下,您在 QMGR_REM 和 QMGR_LOC 上有两个多租户应用程序,其中 QMGR_REM 上的多个应用程序需要响应 QMGR_LOC 上的应用程序,通过向 XMITQ 授予响应应用程序权限,您不能轻易地将 QMGR_REM 上的每个应用程序限制为仅预期的那些队列放置到。
    • @JoshMc - 如果你想确保这两个多租户应用程序不会相互干扰,他们肯定不会共享频道吗?请记住,通过将响应应用程序权限授予回复 Q,您必须为每个回复 Q 执行此操作。它无法扩展,如果您想添加更多队列管理器并迁移到集群,那将是毫无希望的。
    • @MoragHughson 如果不使用不同的 ReplyToQmgrs,您如何建议将回复拆分到两个不同的渠道?
    • Repltoqmgr 两端的别名
    猜你喜欢
    • 2018-07-17
    • 2016-05-05
    • 2018-02-08
    • 2018-06-27
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2018-10-24
    • 2019-08-27
    相关资源
    最近更新 更多