由于工作需要 , 近期初步学习了一下 IBM 的 MQ , 故有此文 , 仅对本次学习做一次记录 , 对知识点进行回忆与巩固。
MQ 是一种通讯的中间件 , 在服务端与客户端都安装上 MQ 时 , 即可通过 MQ 进行通信。在 MQ 里有三个概念:
在刚才我提到 , 当客户端与服务端都装上 MQ 时即可通信 , 这么表达其实是不准确的 , 正确的说法应该是 , 当客户端与服务端都安装 MQ 并创建了队列管理器与队列 , 同时在两个 MQ 之间建立了通道之后 , 两者之间才能进行通信。这么一看 , 感觉非常笼统 , 可以结合实际的例子来学习下。
这里我就不用两台机子了 , 原理都是一样的 , 只需要将我对其中一个队列管理器进行的操作在另外一台机子上实践即可。我在一台机子上建立两个队列管理器(QM_SEND 与 QM_REC) , 在它们之间建立通道 , 最终的效果是 , 当我将信息放入 QM_SEND 的队列中后 , 我能从 QM_REC 中将信息取出来。
先建立一个队列管理器命名为 QM_SEND , crtmqm 命令为创建队列管理器。
crtmqm QM_SEND
dspmq 命令为查看队列管理器的状态 , 此时 , 可以通过 dspmq 命令查看 MQ 的状态 , 由于刚创建队列管理器 , 因此状态还是 Ended immediately , 需要将它 start 才会变成 running。如果只输入 dspmq 能查看到所有队列管理器的状态 , 若只想查看指定队列管理器的状态 , 可以通过「dspmq -m 队列管理器名字」来查看。
通过 strmqm QM_SEND , 启动队列管理器。此时 , 再通过 dspmq 查看状态已经变成了 running。
完成这些之后 , 就可以通过 runmqsc QM_SEND 命令开启控制台 , 为 QM_SEND 定义监听器 , 队列与通道了。
define qlocal(QM_SEND_LOCAL) usage(xmitq)
这个命令表示为 QM_SEND 创建了一个本地队列 , 该队列是用来传输的。qlocal 表示本地队列括号中为定义的本地队列名, usage 表示该队列的用途 , 在这里表示这个用列用于传输。
创建完本地队列后 , 需要为 QM_SEND 创建一个远程队列 , 用于给远程的 MQ (这里指 QM_REC) 发消息 , 每次消息都是放在这个远程队列中发给 QM_REC 的。
define qremote(QM_SEND_REMOTE) rname(QM_REC_LOCAL) rqmname(QM_REC) xmitq(QM_SEND_LOCAL)
qremote 表示创建的队列是远程队列 , rname 参数后面跟的是远程队列设置的本地队列(是的 , 你需要知道远程队列的相关信息 , 例如其队列名与队列管理器名) , rqmname 设置的是远程的队列管理器名 , 这两个值都必须和通信的远程队列保持一致 , xmitq 表示传输队列 , 这里使用的传输队列就是 (QM_SEND_LOCAL)。
定义完两个队列之后 , 需要再设置一个通道。
define channel(QM_SEND.QM_REC) chltype(sdr) conname(‘127.0.0.1(1416)’) xmitq (QM_SEND_LOCAL) trptype(tcp)
大致上都可以看明白 , channel 后跟的是队列名 , 可以随便写 , 不过一般都定义 发送队列管理器.接收队列管理器 , 更容易理解 , 还有一个需要注意的点是发送的队列管理器与接收的队列管理器设置的通道名称需要是一致的 , chltype 表示这个通道是一个发送通道 , conname 后跟的是接收方的 ip 与端口 , 这个端口需要接收方设置一个监听器进行监听 , 由于我这里设置的两个 MQ 都在本机上 , 因此 ip 就直接为本机 , conname 的格式是固定的不能进行更改 , xmitq 设置的是传输队列 , trptype 表示使用 tcp 协议。
定义好通道后就可以开启通道了
start channel(QM_SEND.QM_REC)
设置完成后通过 end 命令退出控制台。
接下来就是对接收队列管理器进行创建与设置 , 相同的命令就不再重复讲解。创建接收队列 , 启动接收队列并打开控制台。
crtmqm QM_REC
strmqm QM_REC
runmqsc QM_REC
def listener(LISTENER.REC) TRPTYPE(TCP) PORT(1416) CONTROL(OMGR)
这里就是对接收队列设置监听器 , LISTENER.REC 为监听器的名称 , 协议是 TCP 协议 , 监听的端口为 1416 , 1416 即刚才在 QM_SEND 中设置通道时 , 设置的端口, CONTROL 标识监听器何时启动与关闭 , QMGR 是设置为随着队列管理器开启而开启 , 队列管理器关闭监听也关闭。
define qlocal(QM_REC_LOCAL) usage(xmitq)
define channel(QM_SEND.QM_REC) chltype(RCVR) trptype(TCP)
end
设置好之后 , 就可以进行验证了 , 通过 amqsput 命令往 QM_SEND_REMOTE 队列中放入信息。
amqsput QM_SEND_REMOTE QM_SEND
amqsput 后第一个参数为队列名 最后的参数为队列管理器名 , 注意将信息放入队列中后 , 需要结束这次信息放入(回车两次) , 接收队列才能收到消息
通过 amqsget 从队列中取出信息
amqsget QM_REC_LOCAL QM_REC
在使用这个命令后 , 如果能看到刚才放入 QM_SEND_REMOTE 队列中的信息 , 表示设置成功。