每当我们关闭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确实效仿,但事实证明,这是在频道死后几分钟。
此后创建的有趣场景是重新启动队列管理器时,发出了一条错误,说明该频道已在运行,但频道作业显示正常情况,显示日志中的“频道启动”和确实它运行良好。
对于可能涉及的外力或是否超时的任何建议都将非常感激。
答案 0 :(得分:1)
有几个可能的原因。该通道似乎是一个出站通道,当QMgr关闭时,它可以处于阻塞网络呼叫中。或者,它可以在批处理中间并在另一侧等待响应。如果另一侧暂停或连接断开,则在等待响应时通道可能会挂起。
如果侦听器仍在运行,则入站通道通常很难停止。如果另一方有要发送的消息并且已启用触发,它将立即尝试重新启动该通道。此请求命中启动进程的侦听器。由于QMgr正在关闭,因此通道无法完成其CONNECT
,但短时间内正在运行通道进程。
无论是入站还是出站,QMgr最终都会杀死不能自行降级的进程。这应该不是问题,因为通道会协商有序重启,尽管它会在日志中留下一些错误。
调整所有这些因素包括TCP Keepalive,HBINT
,DISCINT
,频道重试参数和采用MCA参数。