Triggers MQ深度触发仅在第一次起作用

Triggers MQ深度触发仅在第一次起作用,triggers,ibm-mq,depth,Triggers,Ibm Mq,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.DE

我在深度上定义了一个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,将消息从队列卸载到文件,最后在TEST.queue上设置触发器并禁用GET。在这个设置中,我首先使用上面的代码创建触发器设置,验证定义,然后用100多条消息加载队列,MQ触发并执行脚本,该脚本成功卸载队列并从队列中清除卸载的消息,显示TEST.queue curdepth为零。第一次之后,即使在触发器监视器运行的情况下,当我加载100多条消息时,MQ也不会触发,脚本也不会执行。我在脚本末尾尝试了TEST.QUEUE GET enabled/disabled和trigger/notrigger组合。没有一个组合起作用。触发的所有其他条件似乎也都得到了满足。如果我再次运行上面的代码来定义触发器设置,它将再次工作并停止触发

我错过什么了吗?可以尝试哪些其他设置

提前谢谢


-BReddy

触发器监视器应该在处理队列时自动将队列设置为notrigger,然后在完成后返回到触发器,我认为您的队列卸载。ksh不需要关闭触发器或禁用队列


第二次尝试将100条消息放入队列后,“dis ql('TEST.QUEUE')all”和“dis qstatus('TEST.QUEUE')type(handle)all”的输出是什么?它是否显示为触发器设置的队列并启用?它是否显示连接的进程的IPPROC和OPPROC?queue_offload.ksh是否在处理前100条消息后断开并释放与队列的连接

应用程序读取队列中的所有消息后,是否能够通过MQSET(或alter qlocal)触发“TEST.queue”?

对于触发类型的深度,触发监视器不会重新打开触发-这取决于应用程序。另外,我同意queue_offload.ksh script.IPPROCS和OPPROCS为0。这是一个测试队列,所以除了使用qload实用程序(MO03)的测试队列_offload.ksh之外,没有人使用它。设置触发器和获取(禁用)后,脚本断开连接。禁用,以便(在生产中)没有其他人获得这些消息并累积到下次触发深度。是。它确实使用alter qlocal设置触发器和GET(禁用)。当您最初定义队列时,它不是GET(禁用),然后就可以工作了,对吗?那可能是你的问题。触发器监视器输出日志中有什么内容?可能它正在触发,但无法获取消息,因为您已禁用它。正如我在第一篇文章中指定的,queue_offload.ksh首先启用队列,然后卸载。