2011-07-15 65 views
3

我们有一个队列,需要对消息进行长时间未处理的监控。 我们设置QSVCINT(1800000)即30分钟。具有旧消息的监控队列

仅当没有成功的获取操作时才会发生此事件,或者在大于指定限制的时间间隔内检测到MQPUT调用。 (30分钟)

在我们的情况下,队列在30分钟的时间间隔内不断获取消息(MQPUT),所以不会触发服务间隔高。

我们有其他方法可以检查邮件的年龄并获得警报吗?

回答

3

在回答这个问题之前,让我们在前提中重置一个轻微的误解。队列服务间隔测量PUT到空队列之间的时间或GET(不会清空队列和下一个GET)之间的时间。因此,您没有收到任何事件消息的原因不是PUT活动,而是由于缺少可触发事件的GET活动导致的。换句话说,一旦队列具有深度,您将不会得到任何QSVCINTVL事件,直到发生GET。此外,这些事件在OKHIGH之间切换,因此一旦得到HIGH,您将不会得到另一个HIGH,但最终应该看到一个OK。一旦得到OK事件,您将不会得到另一个,直到HIGH条件发生,因为GET已晚。

想象一下,一个程序在队列中放置10条消息,另一条消息读取第一条消息,然后死亡。 PUT调用不会生成事件,但会启动计时器。由于现在非空队列的默认间隔状态为OK,因此我们规定的第一个GET上没有事件发生。由于没有后续的GET调用,计时器将继续运行,但不会生成任何事件。新消息可以继续到达,但此事件只会在GET成功发生后30分钟或更长时间的GET呼叫中触发。

如果您希望获得一个QSVCINTVL(HIGH)事件库不会有GET活动超过30分钟,它不会这样工作。

还在我身边吗?大!现在回答答案。

如果显示队列状态(例如使用DIS QS(QUEUE.NAME)命令),它将提供最后的GET时间和日期。 DIS QL(QUEUE.NAME) CURDEPTH命令提供队列的深度。这两个命令可以发送到脚本中的runmqsc或使用PCF命令直接发送到命令服务器,并允许您直接查询自队列上最后一次成功GET以来的时间,而不考虑驱动器所需的任何GET活动事件。

使用这种方法,你可以先验证该队列具有深度(因为那时我们不关心,如果有一个空的队列中没有GET电话),然后如果是这样,看看它是如何长久以来自上次GET即使消费程序已经死亡,并且没有GET呼叫正在拨打

希望有所帮助。

+0

Thanks rob ..当队列属性QSVCIEV进入无状态QSVCIEV(NONE)?它是属性QSVCIEV的默认值吗? – Vignesh

+0

是的!该属性控制是否会生成事件。如果设置为NONE,则不会生成事件消息。此外,基于此页面http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/topic/com.ibm.mq.csqzax.doc/mo10860_.htm我相信你*可以*得到一个HIGH事件没有GET。似乎表示可以为PUT或GET生成一个事件。由于OK事件需要GET,因此我认为在QSVCINTVL之后发生的PUT足以产生HIGH事件。我现在没有时间对其进行测试,但这是我从文档中获得的结果。 –