相关的MQGET将清除队列上的其他过期消息



在MQ队列上执行"正常"MQGET时,我的理解是不会检索到过期消息(过期时间已过的消息)。相反,它们将被丢弃,并尝试队列中的下一条消息。

我的问题与相关的MQGET操作有关。由于他们专门寻找具有给定关联ID的消息,他们是否绕过了会导致过期消息被丢弃的正常机制?

换句话说,既然他们在寻找一条特定的信息,他们会直接去寻找那个信息吗?

显然,如果消息已过期,它将被丢弃,我的问题与之前队列中的消息有关。

无论您是通过MsgId或CorrelId直接获得过期消息,还是通过旁边的消息,过期消息都不会返回到您的应用程序。

过期的消息通过内部任务以及通过传递注意到它们的MQGET从队列中清除。

developerWorks上对此进行了详细介绍,其中指出:

要纠正z/OS平台上的这种情况[由于没有MQGET尝试读取过期消息,因此将其留在队列中],可以使用EXPRYINT(过期间隔)队列管理器属性指定要删除消息的时间段。每次达到到期间隔时,队列管理器都会扫描队列以丢弃过期的消息。

如果您的队列管理器位于UNIX分布式平台上,那么MQ V6已经包含了一个expirer任务,该任务在分布式平台上以类似的方式工作。

IBM还有一位更官方的技术专家详细描述了这种行为,位于此处,并表示:

从WMQV6.0开始,添加了在内部静默丢弃过期消息的功能。

当消息过期时,当发出与该消息匹配的MQGET,或者队列管理器的expirer任务在内部删除该消息时,该消息将被丢弃。

默认情况下,内部expirer任务每300秒(5分钟)运行一次。如果您希望更改此任务的频率,可以使用"ExpiryInterval"设置。该值以秒为单位进行配置,范围从1到1000000秒。如果将该值设置为"0",则将禁用该任务。

在z/OS上,"ExpiryInterval"是队列管理器属性。在分布式平台上,可以将"ExpiryInterval"添加到队列管理器的qm.ini文件中的"TuningParameters"节中。

相关内容

最新更新