消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。
IBM WebSphere MQ 产品支持应用程序通过不同组件如处理器、子系统、操作系统以及通信协议的网络彼此进行通信。例如,IBM WebSphere MQ 支持 35 种以上的不同操作系统。
IBM WebSphere MQ 支持两种不同的应用程序编程接口:Java 消息服务(JMS)和消息队列接口(MQI)。在 IBM WebSphere MQ 服务器上,JMS 绑定方式被映射到 MQI。如图 3所示,应用程序直接与其本地队列管理器通过使用 MQI 进行对话,MQI 是一组要求队列管理器提供服务的调用。MQI 的引人之处是它只提供 13 次调用。这意味着对于应用程序编程员它是一种非常易于使用的接口,因为大部分艰苦工作都将透明完成的。
上图 显示了 IBM WebSphere MQ 编程的原理。
图中还显示了消息通道代理(MCA)、通道出口和对象权限管理器(OAM)。
5. MCA 是 IBM WebSphere MQ 程序,它使用现有传输服务诸如 TCP/IP 与 SNA 将消息从本地传输队列移到目标队列管理器。这些传输服务即通道。通道出口是用户写入库,可以在通道运作期间,从已定义位置号之一进入这些库。
6. OAM 是命令和对象管理的缺省授权服务(针对操作系统)。这三个组件对 IBM WebSphere MQ 的现有安全性解决方案非常重要。
下载mq地址:https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/
下载mqadv_dev924_windows.zip 解压安装。
安装完成后右侧工具栏ibmmq图表处于正在启动中,打开ibmmq资源管理器
进入ibmmq资源管理器后,可右键创建一个队列管理器(除名字外,其他默认):input01
或者通过命令行创建,注意cmd要管理员运行
D:\Program Files\IBM\MQ\bin64>crtmqm -q input01
已创建 IBM MQ 队列管理器“input01”。
已创建目录“D:\ProgramData\IBM\MQ\qmgrs\input01”。
队列管理器与安装“Installation1”关联。
正在创建或替换队列管理器“input01”的缺省对象。
缺省对象统计:86 个已创建。0 个已替换。0 个已失败。
正在完成设置。
设置完成。
D:\Program Files\IBM\MQ\bin64>strmqm input01
IBM MQ 队列管理器“input01”正在启动。
队列管理器与安装“Installation1”关联。
在日志重放阶段在队列管理器“input01”上访问了 6 条日志记录。
完成队列管理器“input01”的日志重放。
为队列管理器“input01”恢复了事务管理器状态。
已启用纯文本通信。
使用 V9.2.4.0 启动了 IBM MQ 队列管理器“input01”。
D:\Program Files\IBM\MQ\bin64>endmqm -i input01
IBM MQ 队列管理器‘input01’正在结束。
IBM MQ 队列管理器‘input01’已结束。
D:\Program Files\IBM\MQ\bin64>dltmqm input01
IBM MQ 队列管理器‘input01’已删除。
执行runmqsc可以对队列管理器执行MQSeries命令
PS D:\Program Files\IBM\MQ\bin64> runmqsc input01
5724-H72 (C) Copyright IBM Corp. 1994, 2021.
启动队列管理器 input01 的 MQSC。
display channel(*)
1 : display channel(*)
AMQ8414I: 显示通道细节。
CHANNEL(SYSTEM.AUTO.RECEIVER) CHLTYPE(RCVR)
AMQ8414I: 显示通道细节。
CHANNEL(SYSTEM.AUTO.SVRCONN) CHLTYPE(SVRCONN)
AMQ8414I: 显示通道细节。
CHANNEL(SYSTEM.DEF.AMQP) CHLTYPE(AMQP)
AMQ8414I: 显示通道细节。
CHANNEL(SYSTEM.DEF.CLUSRCVR) CHLTYPE(CLUSRCVR)
AMQ8414I: 显示通道细节。
CHANNEL(SYSTEM.DEF.CLUSSDR) CHLTYPE(CLUSSDR)
AMQ8414I: 显示通道细节。
CHANNEL(SYSTEM.DEF.RECEIVER) CHLTYPE(RCVR)
AMQ8414I: 显示通道细节。
CHANNEL(SYSTEM.DEF.REQUESTER) CHLTYPE(RQSTR)
AMQ8414I: 显示通道细节。
CHANNEL(SYSTEM.DEF.SENDER) CHLTYPE(SDR)
AMQ8414I: 显示通道细节。
CHANNEL(SYSTEM.DEF.SERVER) CHLTYPE(SVR)
AMQ8414I: 显示通道细节。
CHANNEL(SYSTEM.DEF.SVRCONN) CHLTYPE(SVRCONN)
AMQ8414I: 显示通道细节。
CHANNEL(SYSTEM.DEF.CLNTCONN) CHLTYPE(CLNTCONN)
docker仓库地址:https://hub.docker.com/r/ibmcom/mq/
该镜像的默认用户是admin,密码是 passw0rd
docker pull ibmcom/mq
启动IBM MQ服务端
docker run --env LICENSE=accept --env MQ_QMGR_NAME=QM1 --publish 1414:1414 --publish 9443:9443 --detach --network host ibmcom/mq
进入docker
安装完成后可通过web管理器查看:
https://10.10.0.115:9443/ibmmq/console/#/
查看队列管理器(容器内执行)
bash-4.4$ dspmq
QMNAME(QM1) STATUS(Running)
查看可连接通道
进入客户端
runmqsc
执行命令
display channel(*)
默认的用户名和密码
该镜像的默认用户是admin,密码是 passw0rd
服务器ip:你docker安装mq的ip地址
通道名称:DEV.ADMIN.SVRCONN
账号密码:admin/passw0rd
队列管理器名称:QM1
有了以上四个要素后,可使用window队列管理器管理远程队列管理
右键队列管理器-》添加远程队列管理器
输入队列管理器名称(注意名称必须和远程队列管理器名称相同,名称对不上会无法完成链接)
输入服务器主机和通道(注意SVRCONN类型是服务器连接通道)
下两步,选择启用用户标识,输入用户名
点击完成,输入密码
创建完成后菜单显示
MQ中有几个很重要的组件:队列管理器(QueueManager)、队列(Queue)和通道(Channel)。其基本的操作方法如下:
创建队列管理器
crtmqm –q QMgrName
-q是指创建缺省的队列管理器
删除队列管理器
dltmqm QmgrName
启动队列管理器
strmqm QmgrName
如果是启动默认的队列管理器,可以不带其名字
停止队列管理器
endmqm QmgrName 受控停止
endmqm –i QmgrName 立即停止
endmqm –p QmgrName 强制停止
显示队列管理器
dspmq –m QmgrName
运行MQSeries命令
runmqsc QmgrName
如果是默认队列管理器,可以不带其名字
往队列中放消息
amqsput QName QmgrName
如果队列是默认队列管理器中的队列,可以不带其队列管理器的名字
从队列中取出消息
amqsget QName QmgrName
如果队列是默认队列管理器中的队列,可以不带其队列管理器的名字
启动通道
runmqchl –c ChlName –m QmgrName
启动侦听
runmqlsr –t TYPE –p PORT –m QMgrName
停止侦听
endmqlsr -m QmgrName
进去交互命令行:runmqsc 队列管理器名称
定义死信队列
DEFINE QLOCAL(QNAME) DEFPSIST(YES) REPLACE
设定队列管理器的死信队列
ALTER QMGR DEADQ(QNAME)
定义本地队列
DEFINE QL(QNAME) REPLACE
定义别名队列
DEFINE QALIAS(QALIASNAME) TARGQ(QNAME)
远程队列定义
DEFINE QREMOTE(QRNAME) +
RNAME(AAA) RQMNAME(QMGRNAME) +
XMITQ(QTNAME)
定义模型队列
DEFINE QMODEL(QNAME) DEFTYPE(TEMPDYN)
定义本地传输队列
DEFINE QLOCAL(QTNAME) USAGE(XMITQ) DEFPSIST(YES) +
INITQ(SYSTEM.CHANNEL.INITQ)+
PROCESS(PROCESSNAME) REPLACE
创建进程定义
DEFINE PROCESS(PRONAME) +
DESCR(‘STRING’)+
APPLTYPE(WINDOWSNT)+
APPLICID(’ runmqchl -c SDR_TEST -m QM_ TEST’)
其中APPLTYPE的值可以是:CICS、UNIX、WINDOWS、WINDOWSNT等
创建发送方通道
DEFINE CHANNEL(SDRNAME) CHLTYPE(SDR)+
CONNAME(‘100.100.100.215(1418)’) XMITQ(QTNAME) REPLACE
其中CHLTYPE可以是:SDR、SVR、RCVR、RQSTR、CLNTCONN、SVRCONN、CLUSSDR和CLUSRCVR。
创建接收方通道
DEFINE CHANNEL(SDR_ TEST) CHLTYPE(RCVR) REPLACE
创建服务器连接通道
DEFINE CHANNEL(SVRCONNNAME) CHLTYPE(SVRCONN) REPLACE
重置通道
reset chl('JZKJ.TO.CAINIAO_YW')
显示所有通道
display channel(*)
显示队列的所有属性
DISPLAY QUEUE(QNAME) [ALL]
显示队列的所选属性
DISPLAY QUEUE(QNAME) DESCR GET PUT
DISPLAY QUEUE(QNAME)MAXDEPTH CURDEPTH
显示队列管理器的所有属性
DISPLAY QMGR [ALL]
显示进程定义
DISPLAY PROCESS(PRONAME)
更改属性
ALTER QMGR DESCR(‘NEW DESCRIPTION’)
ALTER QLOCAL(QNAME) PUT(DISABLED)
ALTER QALIAS(QNAME) TARGQ(TARGQNAME)
删除队列
DELETE QLOCAL(QNAME)
DELETE QREMOTE(QRNAME)
清除队列中的所有消息
CLEAR QLOCAL(QNAME)
通道连接基本过程
远程队列的定义包含:
推荐使用两个linux,使用相同ibmmq的版本搭建
1.安装两个ibmmq分别创建两个队列管理器QM_LINUXSENDER,另一个为:QM_LINUX。
2.QM_LINUXSENDER作为发送方,QM_LIUNUX作为接收方
3. QM_LINUXSENDER上新建远程队列指定接收方队列管理器为:QM_LINUX,目标队列:Q.LOCAL,传输队列为:Q.TRANSFER
4. 新建发送方通道SC.WINDOW.LINUX关联传输队列:Q.TRANSFER,输入传输目标服务器的ip和端口:注意格式是:ip(端口),我这里是10.10.0.115(1414)
5. 新建传输队列:Q.TRANSFER
6. 新建接收方通道SC.WINDOW.LINUX注意和发送方通道名称一致,因为对于连接通道来说,这两个是绑定在一起的,因为远程队列已经指定了目标队列管理器和名称,所有接收方通道只需要和名字发送方通道保持一致即可,什么都无需关联,由发送方关联好就行。
7. QM_LINUX新建本地队列Q.LOCAL
创建队列管理器
docker run --env LICENSE=accept --env MQ_QMGR_NAME=QM_LINUX --publish 1414:1414 --publish 9443:9443 --detach --network host ibmcom/mq:9.1.5.0-r2-amd64
docker run --env LICENSE=accept --env MQ_QMGR_NAME=QM_LINUXSENDER --publish 1414:1414 --publish 9443:9443 --detach --network host ibmcom/mq:9.1.5.0-r2-amd64
QM_LINUXSENDER上新建远程队列:Q.REMOTE指定接收方队列管理器为:QM_LINUX,目标队列:Q.LOCAL,传输队列为:Q.TRANSFER
队列管理器-》队列-》新建-》远程队列定义
输入关联信息
右键-》通道-》新建-》发送方通道
新建发送方通道SC.WINDOW.LINUX关联传输队列:Q.TRANSFER,连接名称输入传输目标服务器的ip和端口:注意格式是:ip(端口),我这里是10.10.0.115(1414)
启动发送者通道
如果发送方通道未启动一直处于,正在重试的状态,可不予理会,等后面启动接收方通道自动连接。
右键-》队列-》新建-》本地队列
新建传输队列:Q.TRANSFER,用法修改为:传输
注意先按照章节:使用window MQ资源管理器管理linux,远程将队列管理器加入到MQ资源管理
选择QM_LINUX队列管理器-》右键-》接收方通道
新建接收方通道SC.WINDOW.LINUX注意和发送方通道名称一致,配置全部默认即可
新建本地队列Q.LOCAL
在QM_WINDOW上Q.REMOTE上投放消息
放入消息:test
注意这里在QM_WINDOW和QM_LINUX上发送方通道会一直处于重试状态无法连接,这里明显就是通道的认证引起的,有两种方式解决这个问题。
注意发送方和接收方的mq都需要关闭。
禁用后,mq资源管理器暂时不要断开这些远程队列管理器,因为通道认证关闭了,远程就无法连接了。
重启QM_LINUXSENDER的 SC.WINDOW.LINUX通道 发现发送方和接收方都是正常了
发送方的远程队列Q.REMOTE放入测试消息
此时如果放入消息会提示(因为我们关闭了通道认证)
此时我们可以登录到docker容器中使用命令发送和接收
我们在QM_LINXU上使用amqsget 一直不停接收消息
同时在QM_LINUXSENDER使用amqsput发送消息
这里由于关闭了通道认证导致管理器无法连接,需要登录到容器中
runmqsc 进入交互后执行命令
ALTER QMGR CHLAUTH(ENABLED)
注意两个都要打开。
此时如果重启发送方通道后发现,一直处于正在重试阶段了
可以给发送方和接收方的队列添加一个通道认证记录,通道允许对方ip地址访问
比如在发送方。
通道认证记录邮件新建
选择地址:
输入通道名称,点击显示匹配的通道
选择通道后下一步,输入对方的ip地址
固定的用户标识输入:mqm
后面一路默认,接收方通道也是相同的通道名称,对方的ip地址即可,只有下面的不同。
重新启动通道即可,发现一切正常。
右键远程队列,放入测试消息,输入你好后,点击放入消息
**
**
接收方QLOCAL中查看消息是否正常接收,右键浏览消息