IBM WebSphere MQ使用总结
IBM WebSphere MQ是IBM的一个产品,属于消息队列的一种。
具体的介绍可以到IBM的官方网站上看。由于在工作中,使用到它,所以写这篇博客来记录平时学到的知识点。
平时主要使用:7.5 和 8.0的版本
官网参考链接等:
注意: 该博客不再介绍MQ的安装步骤,可以去官网查阅,如果有问题,也可以去官网搜索相关解决方案,IBM的support还是不错的。
前言
在Windows系统上操作MQ有两种方式:
- 界面的方式,通过打开MQ Explorer,然后去查看、配置等
- MQSC命令行的方式
IBM WebSphere MQ 命令
操作IBM MQ的命令,称为 MQSC(MQ Script Command)
Windows系统下,通过管理员权限运行cmd,然后在里面执行MQSC。
在执行对某一个队列管理器的操作之前,先通过下面的命令,来查询当前机器上已经配置了哪些队列管理器:
dspmq
相关命令:
- 显示文件名
dspmqfls
- 显示该IBM MQ软件的版本号及安装信息
dspmqver
注明: 下面命令行中的队列管理器名字、队列名字分别用qmgrName, queueName替代
打开MQ的对象管理,运行MQSeries命令
runmqsc <qmgrName>
end 命令结束MQSC窗口。
常用的MQ命令有: ALTER、CLEAR、DEFINE(等价于DEF)、DELETE、DISPLAY(等价于DIS)、END、EXIT、PING、PURGE、QUIT、REFRESH、RESET、RESOLVE、SET、START、STOP、SUSPEND
可以写成小写
ql (等价于qlocal)、qr(等价于qremote)、chl(等价于channel)、
在MQSC窗口中,直接输入上面的命令,会有相应提示。
队列管理器相关
- 创建队列管理器
crtmqm [option] <qmgrName>
常用选项:
[-q]、[-d DefXmitQ]、[-u DeadQ]
-q,表示创建缺省队列管理器,一台机器最多只能有一个缺省队列管理器。
-d,表示指明队列管理器的缺省传输队列。
-u,表示指明队列管理器的死信队列。
- 启动队列管理器
strmqm <qmgrName>
- 停止队列管理器
endmqm <qmgrName>
- 删除队列管理器
dltmqm <qmgrName>
DEFINE 命令
下面的REPLACE表示替换,因此下面的语句可以重复运行;DEFPSIST(YES)代表持久化;
- 定义本地队列
DEFINE QLOCAL(queueName) DEFPSIST(YES) PUT(ENABLE) GET(ENABLE) REPLACE
- 定义远程队列
DEFINE QREMOTE(queueName) RNAME(远程队列名) RQMNAME(远程队列管理器名) XMITQ(传输队列名) DEFPSIST(YES) REPLACE
- 定义本地传输队列
DEFINE QLOCAL(queueName) USAGE(XMITQ) DEFPSIST(YES) PUT(ENABLE) GET(ENABLE) TRIGGER TRIGTYPE(EVERY) TRIGDATA(sdrChannel) INITQ(SYSTE.CHANNEL.INITQ) PROCESS(PROCESSNAME) REPLACE
- 定义死信队列
DEFINE QLOCAL(queueName) DEFPSIST(YES) REPLACE
- 定义进程
DEFINE PROCESS(PRONAME) DESCR('STRING') APPLTYPE(WINDOWSNT) APPLICID('runmqchl -c sdr_chl -m QmgrName')
其中APPLTYPE的值可以是:CICS、UNIX、WINDOWS、WINDOWSNT等。
- 定义侦听器
DEFINE LISTENER(listenerName) TRPTYPE(TCP) CONTROL(QMGR) PORT(port) REPLACE
- 创建服务器连接通道
下面的CHLTYPE可以是:SDR、SVR、RCVR、RQSTR、CLNTCONN、SVRCONN、CLUSSDR和CLUSRCVR。
DEFINE CHANNEL(chlName) CHLTYPE(SVRCONN) MCAUSER('MUSR_MQADMIN') TRPTYPE(TCP) REPLACE
- 创建发送方通道
DEFINE CHANNEL(chlName) CHLTYPE(SDR) CONNAME(127.0.0.1(1010)) XMITQ(传输队列名) TRPTYPE(TCP) REPLACE
- 创建接收方通道
DEFINE CHANNEL(chlName) CHLTYPE(RCVR) TRPTYPE(TCP) REPLACE
注意:如果是两个队列管理器之间进行通信,那么需要注意下面2点
- 两个队列管理器的 CCSID属性值要一样
- 第一个队列管理器的发送通道名和第二个队列管理器的接收方通道名是一样的,同理,第一个队列管理器的接收方通道名和第二个队列管理器的发送方通道名相同
DISPLAY 命令
- 显示队列管理器的所有属性(也可以指定具体某一个属性)
DISPLAY QMGR ALL
- 显示队列的所有属性
DISPLAY QUEUE (queueName) ALL
- 显示队列的所选属性
例如:
DISPLAY QUEUE (queueName) DESCR GET PUT
DISPLAY QUEUE (queueName) MAXDEPTH CURDEPTH
display queue(queueName) CURDEPTH
查看当前队列中有多少条信息
- 显示进程定义
DISPLAY PROCESS(PRONAME)
- 显示通道的所有属性(也可以指定具体某一个属性)
DISPLAY CHANNEL (chlName) ALL
- 显示所有的队列
display queue(*)
could add the where condition to filter the data
DISPLAY QUEUE(*) WHERE()
例如:
DISPLAY QUEUE(*) WHERE(DEFPSIST EQ YES)
- 添加过滤条件,显示所有的队列:
例如,以test开头,display queue(test*)
dis ql(*) usage
查出每个队列的用途,本地队列或者是传输队列
dis qr(*)
查看远程队列
dis qa(*)
近查看别名队列,to see only alias queues
- 查看Channel的状态
dis chs(*)
或
display chstatus (*)
参数all, 显示所有的属性
- 显示所有通道
display channel (*)
ALTER 命令
- 设定队列管理器的死信队列
ALTER QMGR DEADQ(deadQName)
启动、停止命令
- 启动通道
runmqchl -c <chlName> -m <qmgrName>
或
START CHANNEL(channelName)
- 启动侦听
runmqlsr -t TYPE -p PORT -m <qmgrName>
或
START LISTENER(listenerName)
- 停止侦听
runmqlsr -m <qmgrName>
DELETE 命令
- 删除队列
DELETE QLOCAL <queueName>
DELETE QREMOTE <queueName>
SET 命令
- 修改channel的认证信息
SET CHAUTH(*) TYPE(BLOCKUSER) USERLIST('nobody', '*MQADMIN')
解释:把当前的blockuser(*MQADMIN)修改为nobody
操作队列中的消息
- 往队列中放消息
amqsput <queueName> <qmgrName>
如果队列是默认队列管理器中的队列,可以不带其队列管理器的名字
- 从队列中取出消息
amqsget <queueName> <qmgrName>
如果队列是默认队列管理器中的队列,可以不带其队列管理器的名字
- 清除队列中的所有消息
CLEAR QLOCAL <queueName>
常见错误代码
根据reason code查询相关的具体错误原因
mqrc <code>
- Reason Code: 2035
错误大概意思是: 此用户没有连接权限
原因1:server connetion channel上没有配置MACUSER 用户标识, 如MUSR_MQADMIN; 一定要确保MUSR_MQADMIN用户为mqm组的成员。
方法1:在服务器端的服务连接通道定义中设置MCAUSER属性的值为MUSR_MQADMIN, 或者通过修改实现。
方法2: 若保持MQ服务器端的通道定义的MCAUSER属性值为缺省值,即为空,则可将MQ客户端所使用的用户添加到MQ服务器所在的操作系统中。
例如,若MQ客户端使用的用户为ADMIN,则在MQ服务器端添加用户ADMIN,并保证此用户在MQ服务器端的mqm组中,以及有执行队列管理器上的操作所必需的权限。
- Reason Code: 2059
首先,需要确定队列管理器的端口,是运行的,代码中配置的也是一样的;还有就是检查CCSID的值,队列管理器和代码中的配置是否一致。