webspheremq初步使用
一、简介
webspheremq就ibm推出的商业消息中间件,又称ibm mq,目前在传统行业如银行等仍在广泛使用,这里webspheremq安装及初步使用进行介绍。
二、基础知识
参考文档:https://www.ibm.com/support/knowledgecenter/zh/SSFKSJ_7.5.0/com.ibm.mq.explorer.doc/bi00112_.htm
2.1 基本概念
2.1.1 消息
消息是数据的载体,由消息描述(如消息id、消息类型、消息优先级等)和数据组成。消息最大长度为100MB,默认最大长度为4MB。消息有下面4种类型:
- 请求消息(request message):从客户端发往服务端的查询或更新消息通常为请求消息,请求消息需要应答,消息中包含回复消息的路由信息;
- 回复消息(reply message):回复消息是对请求消息的应答,回复地址来自于请求消息;
- 报文消息(datagram message):报文消息不需要回复,只是单向的消息传递;
- 报告消息(report message):报告消息用于对系统故障的响应,由应用程序或队列管理器(如远程队列不存在或已满)创建;
2.2 队列
队列是存储消息的数据结构,按功能常用有:
- 本地队列(local queue):本地队列是本地队列管理器中的队列,存在于本地内存或磁盘中,由本地队列管理器控制访问;
- 远程队列(remote queue):远程队列属于不与当前应用直接相连的队列管理器,只能向远程队列放消息,不能从远程队列中读消息。
- 传输队列(transmission queue):传输队列(关联远程队列管理器)位于本地队列管理器上,是临时存储目标为远程队列管理器的消息队列;
- 死信队列(dead letter queue):死信队列用于存储无法发送到目的地(如目的队列不存在或队列已经满了)的消息;
除上述队列外,还有动态队列、命令队列、回复队列、别名队列等。
2.3 队列管理器
队列管理器是队列或其他对象的容器,管理拥有的队列。与应用直接相连的管理器为本地队列管理器。
2.4 通道
通道是不同队列管理器之间通信的路径,通道是单行的,通过消息通道代理将不同队列管理器连接起来。常用通道类型有:
- 发送通道(sender, SRD):消息发送方;
- 接收通道(receiver, RCVR):消息接收方;
- 服务器通道(server, SVR):消息接收方;
- 请求器通道(requester, RQSTR):消息发送方;
- 集群发送通道(cluster sender, CLUSSDR):消息发送方;
- 集群接收通道(cluster receiver, CLUSRCVR):消息接收方;
通道间的组合是固定的且每队通道名称需要一致,组合如下:
三、安装
3.1 websphere基本安装
websphere基本安装步骤如下:
下载webspheremq安装包:
wget http://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/mqadv_dev915_ubuntu_x86-64.tar.gz解压并进入安装包:
#解压后的文件为MQServer tar -zxvf mqadv_dev915_ubuntu_x86-64.tar.gz cd MQServer同意安装协议:
sudo ./mqlicense.sh -text_only安装websphere mq和websphere mq explorer(mq的界面查看工具):
#下面三个为依赖包,需提前安装 sudo dpkg -i ibmmq-runtime_9.1.5.0_amd64.deb sudo dpkg -i ibmmq-gskit_9.1.5.0_amd64.deb sudo dpkg -i ibmmq-jre_9.1.5.0_amd64.deb #安装websphere server sudo dpkg -i ibmmq-server_9.1.5.0_amd64.deb #安装websphere client sudo dpkg -i ibmmq-client_9.1.5.0_amd64.deb #安装示例 sudo dpkg -i ibmmq-samples_9.1.5.0_amd64.deb检查安装
dpkg -l | grep mq查看安装版本信息
cd /opt/mqm bin/dspmqver输出如下:
Name: IBM MQ Version: 9.1.5.0 Level: p915-L200318.DE BuildType: IKAP - (Production) Platform: IBM MQ for Linux (x86-64 platform) Mode: 64-bit O/S: Linux 4.18.0-25-generic O/S Details: Ubuntu 18.04.2 LTS (Bionic Beaver) InstName: Installation1 InstDesc: Primary: No InstPath: /opt/mqm DataPath: /var/mqm MaxCmdLevel: 915 LicenseType: Developer
3.2 管理界面ibmmq-explorer安装
管理界面ibmmq-explorer安装如下:
#安装mq的界面查看工具explorer
sudo dpkg -i ibmmq-explorer_9.1.5.0_amd64.deb
#启动explorer
/opt/mqm/bin/strmqcfg
四、常用命令
进入目录/opt/mqm。
4.1 用户管理
#修改密码,这里设置为root
sudo passwd mqm
#切换用户为mqm
su mqm
4.2 队列管理器
#进入目录
cd /opt/mqm
#创建队列管理器QUEUE_ONE_MANAGER
bin/crtmqm -q QUEUE_ONE_MANAGER
#启动队列管理器QUEUE_ONE_MANAGER
bin/strmqm QUEUE_ONE_MANAGER
#查看队列管理器
bin/dspmq
#查看队列管理器详细信息
bin/dspmq -o all
#查看队列管理器详细信息
bin/dspmq -o all -m QUEUE_ONE_MANAGER
#查看队列管理器配置信息
bin/dspmqinf QUEUE_ONE_MANAGER
#停止队列管理器
bin/endmqm QUEUE_ONE_MANAGER
#删除队列管理器
bin/dltmqm QUEUE_ONE_MANAGER
#选中队列管理器,进入MQSC命令,之后可在指定队列管理器上运行命令
bin/runmqsc QUEUE_ONE_MANAGER
4.3 队列
#选中队列管理器,进入MQSC命令,之后可在指定队列管理器上运行命令
bin/runmqsc QUEUE_ONE_MANAGER
#创建本地队列QUEUE_ONE
define qlocal(QUEUE_ONE)
#创建本地队列QUEUE_ONE, usage表示队列用法,normal:本地队列 xmitq:传输队列
define qlocal(QUEUE_TR) usage(xmitq)
#查看本地队列QUEUE_ONE
display qlocal(QUEUE_ONE)
#修改本地队列QUEUE_ONE
alter qlocal(QUEUE_ONE) maxmsgl(10)
#删除本地队列QUEUE_ONE
delete qlocal(QUEUE_ONE)
#查看队列QUEUE_ONE状态
display qstatus(QUEUE_ONE)
#创建远程队列
#qremote:远程队列名称,一般与rename相同
#rename:远程队列管理器中的本地队列
#rqmname:远程队列管理器
#xmitq:使用的传输队列
define qremote(QUEUE_TWO) rename(QUEUE_TWO) rqmname(QUEUE_TWO_MANAGER) xmitq(QUEUE_TR)
#停止MQSC
end
其他类型队列有:
qlocal:本地队列
qremote:远程队列
qalias:别名队列
qmodel:模型队列
4.4 通道
#选中队列管理器,进入MQSC命令,之后可在指定队列管理器上运行命令
bin/runmqsc QUEUE_ONE_MANAGER
#创建发送通道
#channel:通道名称
#chltype: 通道类型,sdr/rcvr/svr/rqstr/clussdr/clusrcvr
#conname:连接名称,格式: ip(port)
#xmitq:传输队列
#trptype:协议类型
define channel(ONE_TWO_CHL) chltype(sdr) conname('127.0.0.1(9003)') xmitq(QUEUE_TR) trptype(tcp)
#创建接收通道
define channel(ONE_TWO_CHL) chltype(RCVR)
#查看通道
display channel(ONE_TWO_CHL)
#删除通道
delete channel(ONE_TWO_CHL)
#启用通道
start channel(ONE_TWO_CHL)
#停止通道
stop channel(ONE_TWO_CHL)
#重置通道
reset channel(ONE_TWO_CHL)
#测试通道
ping channel(ONE_TWO_CHL)
#修改通道
alter channel(ONE_TWO_CHL)
#解决通道争议
resolve channel(ONE_TWO_CHL)
4.5 消息
#进入目录
cd /opt/mqm/samp/bin
#放消息,注意
bin/amqsput QUEUE_ONE QUEUE_ONE_MANAGER
#取消息
bin/amqsget QUEUE_ONE QUEUE_ONE_MANAGER
#读消息,但不取消息,消息仍在队列中
bin/amqsbcg QUEUE_ONE QUEUE_ONE_MANAGER
4.6 字符集
#选中队列管理器,进入MQSC命令,之后可在指定队列管理器上运行命令
bin/runmqsc QUEUE_ONE_MANAGER
#查看当前字符集, ccsid为1208即为utf-8编码, 1386为gbk编码 819: ISO-8859-1:Latin-1 countries
display qmgr ccsid
#修改字符集
alter qmgr ccsid(1386)
五、消息发送
5.1 消息完整发送流程
消息完整发送流程为远程队列(放消息)-> 传输队列->发送通道| -> |接收通道->本地队列(取消息),如下:
5.2 消息完整发送流程示例
这里示例消息远程发送,从队列管理器QUEUE_ONE_MANAGER的远程队列QUEUE_TWO,发送消息到队列管理器QUEUE_TWO_MANAGER的本地队列QUEUE_TWO。
5.2.1 接收端
crtmqm QUEUE_TWO_MANAGER
strmqm QUEUE_TWO_MANAGER
runmqsc QUEUE_TWO_MANAGER
define ql(QUEUE_TWO)
define channel(ONE_TWO_CHL) chltype (RCVR) trptype (TCP)
alter listener(system.default.listener.tcp) trptype(tcp) port(9004)
start listener(system.default.listener.tcp)
5.2.2 发送端
crtmqm QUEUE_ONE_MANAGER
strmqm QUEUE_ONE_MANAGER
runmqsc QUEUE_ONE_MANAGER
define qlocal(QUEUE_TR) usage (xmitq)
define qremote(QUEUE_TWO) rname (QUEUE_TWO) rqmname(QUEUE_TWO_MANAGER) xmitq (QUEUE_TR)
define channel(ONE_TWO_CHL) chltype(sdr) conname('127.0.0.1(9004)') xmitq(QUEUE_TR) trptype(tcp)
start channel(ONE_TWO_CHL)
5.3 测试
5.3.1 发送端
进入发送命令行:
samp/bin/amqsput QUEUE_TWO QUEUE_ONE_MANAGER
输入:
hello,nice to meet you
study hard
make progress everyday
5.3.1 接收端:
进入接收命令行:
samp/bin/amqsput QUEUE_TWO QUEUE_ONE_MANAGER
输出:
message <hello,nice to meet you>
message <study hard >
message <make progress everyday>
六、备注
6.1 常见问题
6.1.1 code2058
报错:放或取消息时,报错,MQCONNX ended with reason code 2058
原因:队列名没有大写
解决:操作队列时改为大写
6.1.2 code2035
报错:放或取消息时,报错,MQCONNX ended with reason code 2035
原因:用户没在mqm组
解决:切换为mqm用户或把当前用户加入mqm组
6.2 相关文档查看
6.2.1 字符集文档
ibm字符集: https//www.ibm.com/support/knowlegdgecenter/SS4SVW_3.0.0./designing/ccsid_list.html
6.2.2 命名相关文档
对象命名规范: https://www.ibm.com/docs/zh/was-nd/9.0.5?topic=information-mq-naming-restrictions
6.2.2 消息发送到远程文档
消息发送到远程: https://www.ibm.com/docs/zh/ibm-mq/7.5?topic=tutorials-tutorial-2-sending-message-remote-queue
官网示例具体流程,发送方如下:
#消息接收方receiver:
crtmqm QM_APPLE
strmqm QM_APPLE
runmqsc QM_APPLE
define ql(Q1)
define channel (QM_ORANGE.QM_APPLE) chltype (RCVR) trptype (TCP)
alter listener(system.default.listener.tcp) trptype(tcp) port(9002)
start listener(system.default.listener.tcp)
./amqsget Q1 QM_APPLE
接收方如:
#消息发送方sender:
crtmqm QM_ORANGE
strmqm QM_ORANGE
runmqsc QM_ORANGE
define qlocal(QM_APPLE) usage (xmitq)
define qremote (Q1) rname (Q1) rqmname(QM_APPLE) xmitq (QM_APPLE)
define channel(QM_ORANGE.QM_APPLE) chltype(sdr) conname('127.0.0.1(9002)') xmitq(QM_APPLE) trptype(tcp)
start channel(QM_ORANGE.QM_APPLE)
./amqsput Q1 QM_ORANGE