WebSphere MQ 原理及配置解析

WebSphere MQ包含一系列概念,队列管理器、队列、通道、监听等。其中队列又包含本地队列、远程队列、别名队列、模型队列等。本地队列也分为初始化队列、目标队列、死信队列、应答队列、命令队列、传输队列等。通道也包含多种类型:SDRRCVRSVRRQSTRCLNTCONNSVRCONNCLUSSDRCLUSRCVR。如此之多的概念接触起来苦涩难懂,我们还是通过例子来阐述。

首先,我们来看看最简单的本地队列模型:

对于本例子,非常容易理解。应用通过MQ进行消息传递,通过PUT放入一条消息到队列中,然后通过GET去获取一条消息。消息在MQ队列中排队和传递。对于发送方应用来讲,应用只需要将消息发送到MQ,对于接收方应用来讲,应用从MQ Get消息,即可。因此,使用MQ也非常容易扩展。很容易延伸到以下架构:

MQ之间传递消息对于应用透明,Application1 Put消息到MQ1Application2 MQ2 Get消息。消息从MQ1MQ2MQ自己的传输机制去传输。那么MQ如何去传递消息,那么这里就涉及到以下概念了。通道类型,本地队列,远程队列,传输队列,通道,监听。

首先从通道类型开始,通道类型通常包含Sender—Receiver, Server – Receiver, Server – Requester, Sender—Requester,Sender Connection – Receiver Connection, Cluster Sender – Cluster Receiver六种。

我们讲讲Sender—Receiver模式,在讲解该模式的同时,熟悉MQ的相关概念。还是从架构图入手:

队列管理器是用来管理队列的,必须创建和启动队列管理器,才能进行以后的操作。创建命令非常简单:crtmqm QM1即可创建队列管理器QM1. 创建后,需要使用strmqm QM1来启动队列管理器QM1,然后执行Runmqsc QM1,就可以进入QM1队列管理器,进行后续的队列操作。

如果要将消息发送到远端队列,那么就需要定义远程队列,远程队列指向远端队列,定义远端队列的时候需要知道远端队列的队列管理器的名称和远端队列的本地队列名称。使用define qremote去定义。本例中,定义方法如下:define qremote(QR) RNAME(QL) RQMNAME(QM2) XMITQ(TR)。 Qremote定义远程队列QRRNAME代表远端队列的本地队列名称,RQMNAME代表远端队列管理器的名称,XMITQ代表本地传输队列名称。

远程队列只是一个队列定义,用来指定远端队列管理器中的队列。远程队列不是本地队列,不能用来存放消息,它指向远端的队列,因此,消息发送到远程队列后,会直接被送到传输队列。

传输队列是一种本地队列,它是用来存放要发送到远端的消息。它与普通的本地队列的区别在于它在定义时使用了USAGE(XMITQ),因此具有XMITQ属性。传输队列是可以用来临时存放没有发送的消息。本例中传输队列可以采用如下方法定义:define qlocal(TR) USAGE(XMITQ)。消息到达传输队列后,会通过通道发送到远端队列。

通道是通信双方建立起来的通信连接,通道本身是单向的。如果要建立双向的通道,则需要建立两条通道,一进一出。大家可能注意到我的架构图中两个队列管理器中的通道名称是一样的,通道两端的配置必须匹配,并且名称需要一致,否则无法通信。通道根据双方握手协议中主动、被动、及消息流向可以分为六种类型(前面已经介绍)。本例我们配置Sender Receiver类型,配置方式如下:DEFINE CHANNEL(QM1.QM2) CHLTYPE(SDR) TRPTYPE(TCP) CONNAME(’192.168.44.15(1416)’)XMITQ(TR),配置说明:CHANNEL里面定义了CHANNEL名称,CHLTYPE定义了通道类型,SDR代表Sender类型,其他5种类型,也只是CHLTYPE不同而已。TRPTYPE使用TCP连接。CONNAME填写远端队列监听的端口及IP地址,XMITQ表示传输队列名称。通道配置完成,则QM1队列管理器上的配置也就完成了。

我们再看看队列管理器QM2上的配置。首先创建队列管理器crtmqm QM2,启动队列管理器strmqm QM2

该队列管理器上也有一个和QM1上一样的通道,定义一下:

DEFINE CHANNEL(QM1.QM2) CHLTYPE(RCVR) TRPTYPE(TCP)

注意这里定义的CHLTYPE就变成了RCVR,代表Receiver

通道建立完成,双方通道可以通信,但是我们注意到在QM1队列管理器上我们创建通道的时候,设置了QM2队列管理器的IP地址和监听端口,因此,在QM2服务器,我们还必须配置和启动监听。监听配置方法如下:

runmqlsr –m QM2 –t tcp –p 1416

注意:监听不是在runmqsc中配置,其他操作都是在runmqsc中配置的。

最后,我们就只剩下远端队列的接收消息的队列了。该队列为QM2上的本地队列,配置方法就简单了:

DEFINE QLOCAL(QL)