MQ级联方式使用场景
使用场景:
如上图所示,Application1与Application2要进行通信或者消息互换,使用MQ中间件作为中介。上图中,Application1与Application2通信不进行直接连接,而是通过与MQ通信从而实现二者的通信。图中两个MQ的信息如上描述。其中RemoteQueue为远程队列,该队列指定了目标端对应的队列为Queue,并且该远程队列指定了传输所使用的传输队列尾TransQueue;而此传输队列TransQueue与发送通道CHAN_QMGR1_TO_QMGR2相关联,并且可以在该传输队列上设置触发器。Application1连接通过CHAN_SERVER_CON服务器连接通道连接MQ,将消息放入RemoteQueue远程队列,MQ的远程队列收到放入的消息后将消息放入与之关联的传输队列,传输队列中有消息后么,触发器会产生触发消息,通过发送通道将该条消息发送到目标端。此处需要注意的是,在发送通道中会指定目标端的ip和端口号,并且发送通道的名称需要与目标端接收通道的名称一致,即一个发送通道要对应目标端的一个接收通道,并且名称相同。如此消息便发到了MQ2的接收通道中,MQ2拿到消息后,该消息描述了它的目标点是Queue队列,则MQ2会将消息放入MQ2的Queue本地队列中去。
MQ级联方式的搭建,左边的MQ队列管理器名称叫做MQ1,右边的叫做MQ2:
MQ1的搭建:
1.创建队列管理器MQ1。(使用mqm用户连接MQ所在的机器,dspmq查看队列的状态,查看MQ1是否已经创建,如果已经创建则更换名称,或者删掉重建)
mqm@localhos ~>$crtmqm MQ1
2.启动队列管理器
mqm@localhos ~>$strmqmMQ1
3.进入MQ1的命令行模式
mqm@localhos ~>$runmqsc MQ1
4.定义本地队列Queue,下面的含义不再赘述参见本章的上一节。
DEFINE QLOCAL ('Queue') DEFPSIST (YES) MAXDEPTH(100) REPLACE
5.定义一个远程队列RemoteQueue
DEFINE QREMOTE('RemoteQueue') RNAME('Queue') RQMNAME('MQ2') XMITQ('TransQueue')
RNAME('Queue') 指定了对应的目标端的队列是Queue,RQMNAME('MQ2')指定了目标端的队列管理器名称为MQ2, XMITQ('TransQueue')指定了该远程队列关联的传输队列为‘TransQueue’。
6.定义一个传输队列TransQueue
DEFINE QLOCAL('TransQueue') usage(XMITQ) DEFPSIST(YES) INITQ(SYSTEM.CHANNEL.INITQ) TRIGDATA('CHAN_QMGR1_TO_QMGR2') TRIGTYPE(FIRST) TRIGGER REPLACE
与本地队列不同的是 usage(XMITQ) ,它指定了该队列为传输队列。DEFPSIST(YES)代表队列持久化, INITQ(SYSTEM.CHANNEL.INITQ) TRIGDATA('CHAN_QMGR1_TO_QMGR2') TRIGTYPE(FIRST) TRIGGER 与设置触发器相关,初始化队列为SYSTEM.CHANNEL.INITQ,被触发的通道为'CHAN_QMGR1_TO_QMGR2',触发方式为First,每个消息到达时产生触发事件。
7.定义一个发送通道CHAN_QMGR1_TO_QMGR2
DEFINE CHANNEL('CHAN_QMGR1_TO_QMGR2') CHLTYPE(SDR) CONNAME('192.168.xx.xx(1414)') XMITQ('TransQueue')
CONNAME指定了目标端ip和端口号,CHLTYPE(SDR)指定了通道的类型为发送,XMITQ指定了传输队列的名称。
8.定义一个接收通道CHAN_QMGR2_TO_QMGR1,该名称与发送端的发送通道名称一致。
DEFINE CHANNEL(CHAN_QMGR2_TO_QMGR1) CHLTYPE(RCVR)
9.定义一个服务器连接通道
DEFINE CHANNEL(CHAN_SERVER_CON) CHLTYPE(SVRCONN) REPLACE
10.在定义一个死性队列QDEAD
DEFINE QLOCAL ('QDEAD') DEFPSIST (YES) MAXDEPTH(100) REPLACE
11.给MQ1设置指定的死性队列,当消息无法到达指定的Queue中时,会被放入死性队列QDEAD
ALTER QMGR DEADQ(‘QDEAD’)
12.定义监听器LISTENER.TCP,该端口1414应用程序连接时需要指定。
DEFINE LISTENER('LISTENER.TCP') TRPTYPE(TCP) CONTROL(QMGR) PORT(4141) REPLACE
13.启动监听器LISTENER.TCP
START LISTENER('LISTENER.TCP')
如此发送的一方就搭建完了。
MQ2的搭建:
1.创建队列管理器MQ2。(使用mqm用户连接MQ所在的机器,dspmq查看队列的状态,查看MQ2是否已经创建,如果已经创建则更换名称,或者删掉重建)
mqm@localhos ~>$crtmqm MQ2
2.启动队列管理器
mqm@localhos ~>$strmqm MQ2
3.进入MQ2的命令行模式
mqm@localhos ~>$runmqsc MQ2
4.定义本地队列Queue,下面的含义不再赘述参见本章的上一节。
DEFINE QLOCAL ('Queue') DEFPSIST (YES) MAXDEPTH(100) REPLACE
5.定义一个远程队列RemoteQueue
DEFINE QREMOTE('RemoteQueue') RNAME('Queue') RQMNAME('MQ1') XMITQ('TransQueue')
RNAME('Queue') 指定了对应的目标端的队列是Queue,RQMNAME('MQ1')指定了目标端的队列管理器名称为MQ1, XMITQ('TransQueue')指定了该远程队列关联的传输队列为‘TransQueue’。
6.定义一个传输队列TransQueue
DEFINE QLOCAL('TransQueue') usage(XMITQ) DEFPSIST(YES) INITQ(SYSTEM.CHANNEL.INITQ) TRIGDATA('CHAN_QMGR2_TO_QMGR1') TRIGTYPE(FIRST) TRIGGER REPLACE
与本地队列不同的是 usage(XMITQ) ,它指定了该队列为传输队列。DEFPSIST(YES)代表队列持久化, INITQ(SYSTEM.CHANNEL.INITQ) TRIGDATA('CHAN_QMGR2_TO_QMGR1') TRIGTYPE(FIRST) TRIGGER 与设置触发器相关,初始化队列为SYSTEM.CHANNEL.INITQ,被触发的通道为'CHAN_QMGR2_TO_QMGR1',触发方式为First,每个消息到达时产生触发事件。
7.定义一个发送通道CHAN_QMGR2_TO_QMGR1
DEFINE CHANNEL('CHAN_QMGR2_TO_QMGR1') CHLTYPE(SDR) CONNAME('192.168.xx.xx(4141)') XMITQ('TransQueue')
CONNAME指定了目标端ip和端口号,CHLTYPE(SDR)指定了通道的类型为发送,XMITQ指定了传输队列的名称。
8.定义一个接收通道CHAN_QMGR1_TO_QMGR2,该名称与发送端的发送通道名称一致。
DEFINE CHANNEL(CHAN_QMGR1_TO_QMGR2) CHLTYPE(RCVR)
9.定义一个服务器连接通道
DEFINE CHANNEL(CHAN_SERVER_CON) CHLTYPE(SVRCONN) REPLACE
10.在定义一个死性队列QDEAD
DEFINE QLOCAL ('QDEAD') DEFPSIST (YES) MAXDEPTH(100) REPLACE
11.给MQ1设置指定的死性队列,当消息无法到达指定的Queue中时,会被放入死性队列QDEAD
ALTER QMGR DEADQ(‘QDEAD’)
12.定义监听器LISTENER.TCP,该端口1414应用程序连接时需要指定。
DEFINE LISTENER('LISTENER.TCP') TRPTYPE(TCP) CONTROL(QMGR) PORT(1414) REPLACE
13.启动监听器LISTENER.TCP
START LISTENER('LISTENER.TCP')
小结:此种连接方式适用于小批量消息的发送及接收,即单个队列管理器便能满足需求。此外这种方式是将队列管理器与远程队列进行了绑定,不便于扩展。