环境:windows server 2003,MQ 6.0.
配置:本地队列触发方式:first.
由于用户密码更改,接收电文的通讯程序被监控器调用后报错(connect to db failed,sqlca.sqlcode=-30082),此时间后本地队列有新消息,程序再没有被调用。通讯程序使用新密码编译后,在本地队列放测试消息,程序也不被调用。关闭runmqtrm.exe,手动启动runmqtrm.exe后马上调用通讯程序。
问题:runmqtrm.exe运行原理,为啥假死,是对被调用程序的可用性有标识吗?一次不可用,永远不可用?
对于你的问题,需要先了解MQ触发机制的工作原理。
MQ触发机制是:当一个消息被放到设置为触发的应用队列中时,根据应用队列设置的触发类型及相应的触发事件,队列管理器将产生一条触发消息放入initiation队列中。触发监控器(monitor)从initiation队列读取触发消息并基于消息内容采取相应的动作。
runmqtrm.exe是MQ内嵌的触发监控器。
对于FIRST触发类型,队列管理器产生触发消息的触发事件是触发队列的深度从0改变为1。
对于描述中提到的关于”通讯程序出错和使用新密码编译后,程序也不被调用“问题,是由于不满足触发事件(触发队列的深度从0改变为1),队列管理器没有产生触发消息,所以触发监控器不会有启动通讯程序的动作。
对于描述中提到的“关闭runmqtrm.exe,手动启动runmqtrm.exe后马上调用通讯程序“问题,是当队列管理器发现没有触发监控器运行,而且触发队列的深度又不为0时,将产生一条触发消息放入initiation队列中。当重新启动runmqtrm.exe后,就会马上调用通讯程序,所以不存在runmqtrm.exe假死的问题。
MQ提供了队列管理器的属性TRIGINT,可以指定一个时间间隔,为设置为FIRST类型的触发队列所使用