相关的MQGET是否会清除队列中的其他过期消息?

时间:2014-11-11 04:52:57

标签: message-queue ibm-mq correlated

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

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

换句话说,既然他们正在寻找特定的信息,那么他们只是直接寻找那条信息吗?

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

1 个答案:

答案 0 :(得分:2)

过期的消息永远不会返回到您的应用程序,无论您是由MsgId还是CorrelId直接获取,或者是否接近它。

过期的消息由内部任务从队列中清除,并通过MQGET注意到它们。

这是详细的here on developerWorks,其中声明:

  

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

     

如果您的队列管理器位于UNIX分布式平台上,则MQ V6已合并了一个与分布式平台类似的expirer任务。

IBM还有一个更正式的技术说明,详细说明了行为,位于here,并说明:

  

从WMQ V6.0开始,已添加功能以静默方式内部丢弃过期的消息。

     

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

     

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

     

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