在所有平台上,都有一个特殊的触发监控器叫做通道启动器(Channel Initator),它的作用就是启动通道。
2.2.2 触发类型
l EVERY:
应用队列中每接受到一个消息时,都将产生触发消息。如果应用程序仅仅处理一个消息就结束,可采用这种触发类型。
l FIRST:
应用队列中消息从0变为1时会触发事件。如果当队列中的一个消息到达时启动程序,直到处理完所有消息才结束,则采用这种触发类型。
l DEPTH:
应用队列中消息数目和TriggerDepth(引起触发事件发生时,队列中的消息数目)属性值相同时,才会产生触发事件。当一系列请求的回复都收到时,才启动应用程序,则可以采用这种方法。
需要注意的时,当DEPTH属性值为0的时候,实际上就形成了同步通信。另外,当采用Depth触发时,产生触发消息以后,队列将被修改为非触发方式,如果需要再次触发,需要重新设置成允许触发。
一般而言,在实际应用中,如果通道设置成触发方式,触发类型往往设置成为FIRST和DEPTH。
2.2.3 触发器工作流程
1) 本地或远程应用程序A,往应用队列(Application Queue)中PUT了一条消息。
2) 如果队列的触发类型设置为first,当队列原来深度为0时(队列为空),这时PUT一条消息到队列中将形成触发事件,同时产生一条触发消息,触发消息中将包含进程定义中的信息,因为进程定义中包含启动程序B所需的信息,所以触发消息中也包含了启动程序B所需的信息。
3) 队列管理器创建触发消息,并把它PUT入与应用队列相关的启动队列Initiation Queue。
4) 触发监控器(Trigger Monitor)从启动队列(Initiation Queue)中GET触发消息。
5) 触发监控器处理触发消息,发出启动应用程序B的命令。
6) 应用程序B打开应用队列(Application Queue),并处理队列中的消息。
注:如果是通道触发将可以不需要创建进程对象(process object),只是在传输队列的trigdata中设置需要启动的通道名。
2.2.4 配置消息通道触发
配置消息通道触发启动,需要使用到的对象有传输队列,通道启动队列,发送通道,通道启动器。我们本配置案例中传输队列名是QMB,通道启动队列采用SYSTEM.CHANNEL.INITQ,发送通道名QMA.QMB,通道启动器为runmqchi,该进程在队列管理器启动的时候自动启动。下面我们通过举例来演示配置实现消息通道触发启动。
l 首先我们来查看一下传输队列QMB都有哪些属性,显示如下清单所示,其中清单中的标注红色的属性和通道触发配置相关。
dis ql(QMB)
1 : dis ql(QMB) AMQ8409: 显示队列细节。 QUEUE(QMB) TYPE(QLOCAL) ACCTQ(QMGR) ALTDATE(2009-02-06) ALTTIME(11.41.44) BOQNAME( ) BOTHRESH(0) CLUSNL( ) CLUSTER( ) CLWLPRTY(0) CLWLRANK(0) CLWLUSEQ(QMGR) CRDATE(2008-12-05) CRTIME(10.37.53) CURDEPTH(0) DEFBIND(OPEN) DEFPRTY(0) DEFPSIST(NO) DEFSOPT(SHARED) DEFTYPE(PREDEFINED) DESCR( ) DISTL(YES) GET(ENABLED) HARDENBO INITQ( ) IPPROCS(1) MAXDEPTH(5000) MAXMSGL(4194304) MONQ(QMGR) MSGDLVSQ(PRIORITY) TRIGGER NPMCLASS(NORMAL) OPPROCS(1) PROCESS( ) PUT(ENABLED) QDEPTHHI(80) QDEPTHLO(20) QDPHIEV(DISABLED) QDPLOEV(DISABLED) QDPMAXEV(ENABLED) QSVCIEV(NONE) QSVCINT(999999999) RETINTVL(999999999) SCOPE(QMGR) SHARE STATQ(QMGR) TRIGDATA( ) TRIGDPTH(1) TRIGMPRI(0) TRIGTYPE(FIRST) USAGE(XMITQ) |
l 设置传输队列为触发模式TRIGGER。
l 设置触发类型为every/first/depth其中的一种,例如TRIGTYPE(FIRST)。如果设置为TRIGTYPE(DEPTH),则还需要设置触发深度属性,例如TRIGDPTH(4),表示当队列中的消息数由3个增加到4个的时候才能形成触发事件,但需要注意的是深度触发事件只能产生一次事情,下次传输队列的消息数由3个增加到4个时候不会产生触发事件,所以在消息通道触发中,我们推荐采用TRIGTYPE(FIRST)。
l 在通道触发中,推荐使用SYSTEM.CHANNEL.INITQ队列作为初始队列, 该队列为MQ专用的通道启动队列, 不需要手工启动其触发监视器,设置传输队列INITQ(SYSTEM.CHANNEL.INITQ )属性。
l 通过TRIGDATA属性设置需要触发的通道名,例如TRIGDATA(QMA.QMB )。
l 对于TRIGMPRI属性的含义是基于消息优先级触发,也即某类优先级的消息满足的触发条件才产生触发事件,我们在消息通道触发中不推荐使用。
完整MQSC命令参考如下:
ALTER QL(QMB) +
TRIGGER + TRIGTYPE(FIRST) + INITQ(SYSTEM.CHANNEL.INITQ) + TRIGDATA(QMA.QMB)
|
l 通道的触发监控器我们采用系统的自带的runmqchi程序,缺省队列管理器启动的时候,runmqchi进程会自动启动。
以下文章点击率最高
Loading…