【发布时间】:2018-12-07 11:16:14
【问题描述】:
这是一个普遍的问题。假设我在本地有一个队列管理器。我有一个传输队列/远程队列定义设置,通过它我连接到目标队列管理器队列。如果目标队列管理器队列的最大消息长度容量为 1000,并且如果我放置的消息长度超过该长度,那么它会自动移动到目标队列管理器死信队列,前提是我的传输队列最大消息长度大于我输入的长度。这是预期的行为。但是 MQ 世界上有什么方法可以处理这个问题而不是将其移至死队列?还是应用程序自行负责不超过最大长度?
提前致谢。
【问题讨论】:
-
我唯一一次看到队列的 MAXMSGL 设置为低于默认 4MB 的值是在 z/OS(大型机)队列管理器上,这通常设置为记录大小COBOL 程序正在等待读取。我认为如果长度大于应用程序可以处理的长度而不是在 MQ 级别执行此操作,但很多时候,应用程序读取消息并将其移动到它自己的“坏消息”队列会更好COBOL 程序非常陈旧,没有人有时间维护它们。
-
因为程序无法更改或没有人愿意更改它们,最好在 MQ 级别进行更改,以允许这些消息进入 DLQ 并且不会阻止应用程序处理大小合适的消息。
-
通过快速评论回答您的问题,如果您想从 MQ 配置中确保应用程序放入 QREMOTE 不能放入大于 1000 字节的消息,您可以设置 @
XMITQ本身上的 987654321@。这只有在XMITQ不与其他需要放置大于1000字节的消息的QREMOTE对象共享时才可行。 -
另一个选项,如果应用程序放置的是客户端连接,您可以在
SVRCONN频道上设置MAXMSGL(1000),同样,这只有在应用程序使用该频道放置的唯一消息是不大于 1000 字节。您可能还需要为MQMD留出一些额外空间,因此请测试这些选项中的任何一个以确保它们正常工作。 -
您可以在目的地配置接收通道,使其不放入DLQ。在通道上查找 USEDLQ 参数。然而,这意味着对于持久消息,通道将停止,这不是一种改进。非持久性消息将被丢弃。顺便说一句,您希望有什么替代行为?
标签: ibm-mq