ibm-mq - 队列管理器上的 DLQ *必须*是 QM 上的本地队列吗?

标签 ibm-mq

我们正在尝试将我们企业中的 DLQ 全面整合为一个 Q(如果您愿意,可以称为 Enterprise_DLQ...)。我们在各种平台上混合了 QM - 大型机、各种 Unix 风格 - Linux、AIX、Solaris 等、Windows、AS/400... 这个想法是将 QM 上的 DLQ 配置为 ENTERPRISE_DLQ(即集群 Q)的 DLQ(在 QM 上设置 DEADQ 属性)。企业中的所有 QM 都是集群的成员。然而,当我们测试时,这种方法似乎不起作用。 我通过设置一个具有 4 个 QM 的简单集群对此进行了测试。在其中一个 QM 上,将 QRemote 定义为不存在的 QM 和不存在的 Q,但有效的 xmitq,并在 QM 之间配置所需的 SDR Chl,如下所示:

QM_FR - Full_Repos QM1、QM2、QM3 - 集群成员

QM_FR 托管向集群通告的 ENTERPRISE_DLQ

在 QM3 上设置以下内容: QM3.QM1 - sdr 到 QM1、ql(QM1),使用 xmitq、qr(qr.not_exist) rqmname(not_exist) rname(not_exist) xmitq(qm1),设置 QM1 以在消息到达 QM1 时触发启动 QM3.QM1

在 QM1 上: QM3.QM1 - rcvr chl、ql(local_dlq)、ql(qa.enterise_dlq)、qr(qr.enterprise.dlq)

测试 1: 将 QM1 上的 deadq 设置为 ENTERPRISE_DLQ,将消息写入 QM3 上的 QR.NOT_EXIST 结果:消息保留在 QM1 上,QM3.QM1 正在重试,QM1 错误日志提示无法 MQOPEN Q - ENTERPRISE_DLQ!!

ql(qm1) 深度(1)

测试 2: 将 QM1 上的 deadq 设置为 qr.enterprise.dlq,将消息写入 QM3 上的 QR.NOT_EXIST 结果:消息保留在 QM1 上,QM3.QM1 正在重试,QM1 错误日志提示无法 MQOPEN Q - qr.enterprise.dlq(全部大写)!!

ql(qm1) 深度(2)

测试 3: 将 QM1 上的 deadq 设置为 qa.enterise_dlq,将消息写入 QM3 上的 QR.NOT_EXIST 结果:消息保留在 QM1 上,QM3.QM1 正在重试,QM1 错误日志提示无法 MQOPEN Q - qa.enterise_dlq(全部大写)!!

ql(qm1) 深度(3)

测试 4: 将 QM1 上的 deadq 设置为 local_dlq,将消息写入 QM3 上的 QR.NOT_EXIST 结果:消息保留在 QM1 上,QM3。QM1 正在运行,QM3 ql(QM1) 上的所有消息都会发送到 QM3 上的 local_dlq。

ql(qm1) 深度(0)

现在的问题是:看起来 QM 上的 DLQ必须是本地队列。这是一个正确的结论吗?如果没有,我怎样才能使所有 DLQ 消息转到上面的单个 Q - Enterprise_DLQ?

一个明显的解决方案是在 QM3 上的 local_dlq 上定义一个触发器(并在其他 QM 上执行相同操作),该触发器将读取消息并将其写入集群 Q - ENTERPRISE_DLQ。但这涉及额外的移动部件 - 每个 QM 上的触发器、触发器监视器。最理想的是能够将集群 Q/QRemote/QAlias 配置为 QM 上的 DLQ。想法/想法???

谢谢 -拉维

最佳答案

根据文档here :

A dead-letter queue has no special requirements except that:

  • It must be a local queue
  • Its MAXMSGL (maximum message length) attribute must enable the queue to accommodate the largest messages that the queue manager has
    to handle plus the size of the dead-letter header (MQDLH)

DLQ 为 QMgr 提供了一种处理 channel 无法传递的消息的方法。如果 DLQ 不是本地的,则 channel 的错误处理本身将依赖于 channel 。这会带来一些架构设计缺陷。

执行您所需操作的规定方法是触发作业以将消息转发到远程队列。这样,每当消息到达 DLQ 时,触发的作业就会启动并转发消息。如果您不想编写这样的程序,您可以轻松地使用一些 shell 或 Perl 代码以及 SupportPac MA01 中的 Q 程序。 。建议将用于从 QMgr 发送此类消息的 channel 设置为不使用 DLQ。理想情况下,这些将存在于专用集群中,以便 DLQ 流量不会与应用程序流量混合。

此外,请注意,DLQ 的功能之一是在转换错误阻止消息发送时将消息移出 XMitQ。将它们转发到中央位置将具有将它们放回集群 XMitQ 的效果。同样,如果目的地已满,这些消息也将位于发送 qMgr 的集群 XMitQ 上。如果它们在那里建立了足够的数量,完整的集群 XMitQ 将阻止所有集群 channel 工作。在这种情况下,您需要某种工具来让您有选择地删除消息或将消息移出集群 XMitQ,这会有点困难。

考虑到所有这些,该需求似乎带来的挑战比它解决的问题还要多。建议:最好在不进一步使用 channel 的情况下处理 channel 的错误 - 即在本地。

关于ibm-mq - 队列管理器上的 DLQ *必须*是 QM 上的本地队列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9687041/

相关文章:

Jmeter 连接到 IBM MQ

java - WebSphere MQ 7.1 帮助需求 - 访问或安全

mysql - 如何存储 Websphere MQ 消息以实现持久性?

java - 使用 jms 连接到 ibm mq。指定 channel 和队列管理器

java - WebSphere MQ wmq.jmsra 在 MDB 中出现异常后循环

c - MQSUB 在 pub sub 中结束,原因代码为 2429

java - 如何通过 Java 代码(而不是通过 JMS API - 生存时间)在 WebSphere MQ(队列)中设置消息过期时间

ibm-mq - 如何确定队列的 `MaxMsgLength`的值

ssl - 在 MQ 窗口上更新证书后 channel 未运行

编译 amqsput0.c [MQ]