webspheremq初步使用

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):消息接收方;

通道间的组合是固定的且每队通道名称需要一致,组合如下:

sender
receiver
server
requester
cluster sender
cluster receiver

三、安装

3.1 websphere基本安装

websphere基本安装步骤如下:

  1. 下载webspheremq安装包:

    wget http://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/mqadv_dev915_ubuntu_x86-64.tar.gz
    
    
  2. 解压并进入安装包:

    #解压后的文件为MQServer
    tar -zxvf mqadv_dev915_ubuntu_x86-64.tar.gz
    cd MQServer
    
  3. 同意安装协议:

    sudo ./mqlicense.sh -text_only
    
  4. 安装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
    
  5. 检查安装

    dpkg -l | grep mq
    
  6. 查看安装版本信息

    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

版权声明:本文为chinabestchina原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。