2011-07-15 66 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事件。我現在沒有時間對其進行測試,但這是我從文檔中獲得的結果。 –