1. 首页 > 知识 > 技术

IBM WebSphere MQ介绍及使用

一、IBM WebSphere MQ简介

WebSphere MQ就IBM推出的商业消息中间件,又称IBM MQ,目前在传统行业如银行等仍在广泛使用,这里webspheremq安装及初步使用进行介绍。


二、基础知识

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

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

ibmmq.png

三、安装

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 消息完整发送流程

ibmmq.png

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.2 接收端:

进入接收命令行:

samp/bin/amqsget QUEUE_TWO QUEUE_TWO_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 相关示例查看

官网示例具体流程,

接收方如下:

#消息接收方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


本文由傻鸟发布,不代表傻鸟立场,转载联系作者并注明出处:https://www.shaniao.net/jishu/121.html

加载中~

联系我们

在线咨询:点击这里给我发消息

微信号:

工作日:10:30-15:30,节假日休息