当您MQGET
在 MQ 队列上执行“正常”操作时,我的理解是不会检索过期消息(过期时间已过的消息)。相反,它们将被丢弃并尝试队列中的下一条消息。
我的问题与相关的MQGET 操作有关。由于他们专门寻找具有给定相关 ID 的消息,他们是否绕过导致过期消息被丢弃的正常机制?
换句话说,既然他们正在寻找一个特定的信息,他们会直接去寻找那个信息吗?
显然,如果该消息已过期,它将被丢弃,我的问题与该点之前队列中的消息有关。
当您MQGET
在 MQ 队列上执行“正常”操作时,我的理解是不会检索过期消息(过期时间已过的消息)。相反,它们将被丢弃并尝试队列中的下一条消息。
我的问题与相关的MQGET 操作有关。由于他们专门寻找具有给定相关 ID 的消息,他们是否绕过导致过期消息被丢弃的正常机制?
换句话说,既然他们正在寻找一个特定的信息,他们会直接去寻找那个信息吗?
显然,如果该消息已过期,它将被丢弃,我的问题与该点之前队列中的消息有关。
无论您是通过 MsgId 或 CorrelId 直接获取过期消息,还是通过 get-next 获取过期消息,都不会将其返回给您的应用程序。
过期消息通过内部任务以及通过传递 MQGET 通知它们而从队列中清除。
这在 developerWorks 上有详细说明,其中指出:
要在 z/OS 平台上纠正这种情况 [由于没有 MQGET 尝试读取它们而导致过期消息留在队列中],您可以使用 EXPRYINT(过期间隔)队列管理器属性指定要删除的消息的时间段。每次达到过期间隔时,队列管理器都会扫描队列以丢弃过期消息。
如果您的队列管理器位于 UNIX 分布式平台上,则 MQ V6 包含了一个过期任务,该任务以类似的方式为分布式平台工作。
IBM 还有一个更官方的技术说明,详细说明了该行为,位于此处,并说明:
从 WMQ V6.0 开始,添加了在内部静默丢弃过期消息的功能。
当消息过期时,它将在以下情况下被丢弃: 发出与消息匹配的 MQGET,或者 它被队列管理器的过期任务在内部删除。
默认情况下,内部过期任务每 300 秒(5 分钟)运行一次。如果您希望更改此任务的频率,您可以使用“ExpiryInterval”设置。该值以秒为单位配置,范围为 1 到 1,000,000 秒。如果将值设置为“0”,您将禁用该任务。
在 z/OS 上,“ExpiryInterval”是一个队列管理器属性。在分布式平台上,可以将“ExpiryInterval”添加到队列管理器的 qm.ini 文件中的“TuningParameters”节中。