我们有一个进程在我们关闭 iSeries 服务器时定期运行。它执行以下(特定于 iSeries,但您可以知道 MQSC 命令是什么)命令:
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)
通常这运行没有问题,但在最后一次,六个频道中有五个立即正常结束,而第六个频道在大约 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 *ALL 确实紧随其后,但我已经证明那是在频道死后几分钟。
这为以后创建的有趣场景是,当队列管理器重新启动时,发出一个错误,说明通道已经在运行,但通道作业的显示与正常情况完全一样,在日志中显示“通道启动”,确实是运行良好。
任何关于可能涉及什么外力或是否有超时的建议将不胜感激。