我在DEPTH上定义了一个MQ触发器,如下所示。它在创建后第一次触发,但不会再次触发。定义如下。
DEFINE PROCESS(DEVL.OFFLOAD.PROCESS) APPLTYPE(UNIX) +
APPLICID('/home/mqm/bin/queue_offload.ksh') +
DESCR('Queue Offload Program Triggered on Depth')+
replace
DEFINE QL('TEST.QUEUE') INITQ(SYSTEM.DEFAULT.INITIATION.QUEUE) +
TRIGGER PROCESS(DEVL.OFFLOAD.PROCESS) +
TRIGTYPE(DEPTH) TRIGDPTH(100) +
replace
DEFINE SERVICE(SYSTEM.TRIGGER.MONITOR.SERVICE) +
CONTROL(QMGR) SERVTYPE(SERVER) +
STARTCMD('/usr/bin/runmqtrm') +
STARTARG('-m +QMNAME+ -q SYSTEM.DEFAULT.INITIATION.QUEUE') +
STOPCMD('/usr/mqm/bin/amqsstop') +
STOPARG('-m +QMNAME+ -p +MQ_SERVER_PID+') +
STDOUT('/home/mqm/temp/+QMNAME+_trm.out') +
STDERR('/home/mqm/temp/+QMNAME+_trm.err') +
DESCR('Trigger Monitor Service for Queue Offload') +
replace
DISPLAY SERVICE(SYSTEM.TRIGGER.MONITOR.SERVICE)
START SERVICE(SYSTEM.TRIGGER.MONITOR.SERVICE)
DISPLAY SVSTATUS(SYSTEM.TRIGGER.MONITOR.SERVICE)
queue_offload.ksh脚本禁用触发器并启用GET,将消息从队列卸载到文件,最后设置TRIGGER并禁用TEST.QUEUE上的GET。通过此设置,我首先使用上面的代码创建触发器设置,验证定义,然后使用100多条消息加载队列,MQ触发器并执行脚本,该脚本成功卸载队列并清除队列中的卸载消息,显示TEST.QUEUE零度的curdepth。在第一次运行之后,即使启动了触发器监视器,当我加载100多条消息时,MQ也不会触发,脚本也不会被执行。我尝试启用/禁用TEST.QUEUE GET,并在脚本结束时触发/ notrigger组合。没有组合有所作为。触发的所有其他条件似乎也得到满足。如果我再次运行上面的代码来定义触发器设置,它会再次工作并停止触发。
我错过了什么吗?可以尝试哪些其他设置?
提前致谢。
-BReddy
答案 0 :(得分:0)
触发器监视器应该在处理时自动将队列设置为notrigger,然后在完成时返回触发器,我不认为你的queue_offload.ksh需要关闭触发器或者禁用队列。
" dis ql(' TEST.QUEUE')的输出是什么"和" dis qstatus(' TEST.QUEUE')类型(句柄)全部"在第二次尝试将100条消息放入队列后?它是否显示触发器的队列集并启用?它是否显示连接的进程的ipproc和opproc? queue_offload.ksh是否在处理前100条消息后断开连接并释放与队列的连接?
答案 1 :(得分:0)
在您的应用程序读取队列中的所有消息后,您是否可以重新启动' TEST.QUEUE'通过MQSET(或改变qlocal)?