我们正在尝试将我们企业中的 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/