當我們關閉iSeries服務器時,我們有一個定期運行的進程。它執行以下(i系列的,但你可以告訴MQSC命令是什麼)命令:什麼導致我的MQ頻道死亡?
RCDMQMIMG OBJ(*ALL) OBJTYPE(*ALL) DSPJRNDTA(*YES)
ENDMQMCSVR MQMNAME(IA001.QUEUE.MANAGER)
ENDMQM MQMNAME(IA001.QUEUE.MANAGER)
DLYJOB DLY(120)
ENDMQMLSR MQMNAME(IA001.QUEUE.MANAGER)
通常這種運行沒有問題,但是在最後時刻,五出6個通道正常,並立即和結束大約75秒後,第六個異常結束。
從日誌中通道的工作,這兩個消息都是連續的(即沒有介入的問題):
23/07/12 08:26:44.033529 LIBMQMCS_R QMQM *STMT QCMD QSYS 01C8
From module . . . . . . . . : AMQXEIMX_R
From procedure . . . . . . : xcsSendMessage
Statement . . . . . . . . . : 38
Message . . . . : Channel 'IA001.TO.ISPRO' is starting.
Cause . . . . . : Channel 'IA001.TO.ISPRO' is starting. Recovery . . . :
None. Technical Description . . . . . . . . : None.
04/08/12 21:11:28.872098 QWTPITP2 QSYS 061A *EXT *N
Message . . . . : Job ended abnormally.
Cause . . . . . : A SIGKILL signal was received for the job. The action for
the signal was to terminate the job.
注意,ENDMQM不使用* WAIT等待隊列管理器來結束(對默認* CNTRLD在起作用),但我認爲這對這種情況不會有什麼幫助,因爲我找不到任何證據表明任何其他程序可能會暫停程序。通道作業的強制結束髮生在手動插入代碼的120秒延遲內(我知道,我們應該使用* WAIT,但這個代碼很舊)。
我認爲在隊列管理器結束時假定通道正在處理消息是合理的,否則爲什麼在下一個操作之前經過75秒?似乎* CNTRLD選項有一個隱含的超時時間,儘管我無法在文檔中的任何位置看到這一點。要麼這樣,要麼干涉別的東西。但是什麼?
一個ENDSBS *所有確實如此,但我已經證明這是在頻道死亡後幾分鐘。
以後創建的有趣場景是,當隊列管理器重新啓動時,出現錯誤說明通道已在運行,但通道作業完全按照正常情況顯示,顯示日誌中的「通道啓動」事實上它運行良好。
任何有關可能涉及哪些外力或者是否有超時的建議都將不勝感激。
感謝您的信息。 這確實是一個出站渠道。奇怪的是,使用通過這個通道運行的隊列的系統進程在幾分鐘之前就被關閉了,所以幾乎不可能有任何連接或者有任何消息要發送。 很明顯,隊列管理器在關閉時「清理乾淨」,但是重新啓動後,其頭部的實際問題仍然存在。 – zkarj 2012-08-07 22:09:40
我們的啓動過程啓動隊列管理器,命令服務器和偵聽器,然後運行MQ命令腳本來啓動所有出站通道。該通道在該通道上執行失敗,稱該通道「正在使用」,並且在深入挖掘時已經「正在運行」。 我假設了猝死和重啓錯誤之間的聯繫。 – zkarj 2012-08-07 22:13:46
我會研究你所建議的調整參數,但我認爲這是一個'正在發生的事情',正如你所建議的那樣,但我們永遠不會知道那是什麼。 – zkarj 2012-08-07 22:15:47