IBM MQ实际工作常用知识点

最近的工作内容有些变化,开始接触了IBM MQ大概一个月时间,这一个月来一些总结如下,欢迎大家来批评指正,一些常见问题和坑点我也会及时补充在之后的时间里。共勉。新年快乐!

IBM MQ基本操作

配置:

第一部分:队列管理器

本例中BAASDEC_RDMRCVS_GW为队列管理器名

1)创建队列管理器:

crtmqm BAASDEC_RDMRCVS_GW

或者是 crtmqm -q BAASDEC_RDMRCVS_GW(-q是指创建缺省的队列管理器)

或者是 crtmqm -lc -lf 100 -lp 3 -ls 3 BAASDEC_RDMRCVS_GW
解释下:
-lc 是采用循环日志
-lf 是每块日志的大小,4k为单位的,100就是100*4k
-lp 是主逻辑日志的数量
-ls 是辅逻辑日志的数量

2)删除队列管理器

dltmqm BAASDEC_RDMRCVS_GW

3)启动队列管理器

strmqm BAASDEC_RDMRCVS_GW

4)停止队列管理器

4-1)受控停止

endmqm BAASDEC_RDMRCVS_GW

4-2)立即停止

endmqm -i BAASDEC_RDMRCVS_GW

4-3)强制停止

endmqm -p BAASDEC_RDMRCVS_GW

5)显示队列管理器

dspmq -m BAASDEC_RDMRCVS_GW

6)运行队列管理器

runmqsc BAASDEC_RDMRCVS_GW

第二部分:队列

1)本地队列

创建:

DEFINE QLOCAL (BAASDEC_RDMRCVS_TRA) USAGE (XMITQ) DEFPSIST(YES) MAXDEPTH(100000) TRIGGER TRIGTYPE(FIRST) INITQ(SYSTEM.CHANNEL.INITQ) TRIGDATA(BAASDEC.RDMRCVS.CHL) REPLACE

参数介绍:

QLOCAL (BAASDEC_RDMRCVS_TRA) :BAASDEC_RDMRCVS_TRA为传输队列名称;

USAGE (XMITQ):定义该队列为传输队列

(参数详解:USAGE

如果是NORMAL代表的是本地队列

如果是XMITQ代表的是传输队列);

DEFPSIST(YES):队列上的消息在队列管理器重新启动时保存了下来

(参数详解:DEFPSIST:队列中消息持久性默认值。
NO 该队列上的消息在队列管理器重新启动时丢失
YES 该队列上的消息在队列管理器重新启动时保存了下来。);

MAXDEPTH(100000):队列上允许的最大消息数为100000;

TRIGTYPE(FIRST):触发类型第一条消息触发,有第一条消息之后开始创建队列

INITQ(SYSTEM.CHANNEL.INITQ) :初始队列为SYSTEM.CHANNEL.INITQ

TRIGDATA(BAASDEC.RDMRCVS.CHL) :触发数据,也就是触发后要启动的通道为BAASDEC.RDMRCVS.CHL

其中:DEFINE可以缩写为DEF,QLOCAL可以缩写为QL。

删除:

DELETE QLOCAL (BAASDEC_RDMRCVS_TRA)

2)远程队列

创建:

DEFINE QREMOTE (BAASDEC_RDMRCVS_REMOTEQ) RNAME (RDMRCVS.RECV.BAASDEC.QUEUE) RQMNAME (RDMRCVS.CLUSTER) XMITQ (BAASDEC_RDMRCVS_TRA) CLUSTER (BAASDEC) REPLACE

参数介绍:

QREMOTE (BAASDEC_RDMRCVS_REMOTEQ):发送方远程队列名称BAASDEC_RDMRCVS_REMOTEQ;

RNAME (RDMRCVS.RECV.BAASDEC.QUEUE):接收方的本地接收队列名RDMRCVS.RECV.BAASDEC.QUEUE,这个需要和对手系统确认好,这个就是对方系统配置的本地队列名;

RQMNAME (RDMRCVS.CLUSTER):接收方队列管理器名,RDMRCVS.CLUSTER;

XMITQ (BAASDEC_RDMRCVS_TRA):发送方传输队列名,传输队列BAASDEC_RDMRCVS_TRA;

CLUSTER (BAASDEC):所属的集群为BAASDEC。

其中:DEFINE可以缩写为DEF,QREMOTE 可以缩写为QL。

注意:RNAME 与对方本地队列名相同是需要一样的,否则消息无法发送出去。

3)死信队列:

定义一个死信队列DEADQ

DEFINE QLOCAL(DEADQ)MAXDEPTH(290000) DEFPSIST(YES) REPLACE

设定队列管理器的死信队列

ALTER QMGR DEADQ(DEADQ)

第三部分:通道

通道的一些属性:

发送通道:CHLTYPE (SDR)

接收通道:CHLTYPE (RCVR)

群集发送通道:CHLTYPE (CLUSSDR)

群集接收通道:CHLTYPE (CLUSRCVR)

MQI连接服务器通道:CHLTYPE (SVRCONN)

1)发送通道

DEFINE CHANNEL() CHLTYPE(SDR) TRPTYPE (TCP) DISCINT(0) CONNAME('22.188.183.244(1817)') XMITQ (BAASDEC_RDMRCVS_TRA)  REPLACE

参数介绍:

CHANNEL(BAASDEC.RDMRCVS.CHL):发送通道名为BAASDEC.RDMRCVS.CHL;

CHLTYPE(SDR):CHLTYPE设置通道类型,发送通道;

TRPTYPE (TCP):TRPTYPE 设置通讯协议,TCP;

DISCINT(0) :DISCINT设置通道停止时间间隔(0为永不停止);

CONNAME('22.188.XXX.XXX(1X1X)'):连接地址为22.188.XXX.XXX(1X1X);

XMITQ (BAASDEC_RDMRCVS_TRA):传输队列名称为BAASDEC_RDMRCVS_TRA。

2)接收通道:

DEFINE CHANNEL (RDMRCVS.BAASDEC.CHL) CHLTYPE (RCVR) TRPTYPE(TCP) REPLACE

参数介绍:

CHANNEL (RDMRCVS.BAASDEC.CHL):接收通道名为RDMRCVS.BAASDEC.CHL,通常和发送通道的名称互换一下部分内容。

CHLTYPE (RCVR):接收通道。

3)群集发送通道:

如果涉及集群的话

DEFINE CHANNEL(TO.BAASDEC_QM2) CHLTYPE(CLUSSDR) TRPTYPE(TCP) DISCINT(0) CONNAME('22.188.XXX.XXX(5X4X)') CLUSTER (BAASDEC) REPLACE

参数含义同上

4)群集接收通道:

如果涉及集群的话

DEFINE CHANNEL(TO.BAASDEC_GW) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) DISCINT(0) CONNAME('22.188.XXX.XXX(4X0X)') CLUSTER (BAASDEC) REPLACE

参数含义同上

5)MQ连接服务器通道

DEFINE CHANNEL(BAASDEC_CVS_SVRCONN) CHLTYPE(SVRCONN) REPLACE

定义服务器连接通道BAASDEC_CVS_SVRCONN,该通道的用途是供应用程序连接的,应用程序通过服务器连接通道从而连接MQ。

第四部分:监听器

监听器是用于监听外界对队列管理器的连接的程序,就是对方MQ管理器来探测,本地要给对方一个回应,监听器就是起这个作用的。

1)创建监听器LSNRPMTS_BAAS

DEFINE LISTENER(LSNRPMTS_BAAS) TRPTYPE(TCP) PORT(4001) BACKLOG(0) CONTROL(QMGR) REPLACE

参数介绍:

LISTENER(LSNRPMTS_BAAS):监听器的名称为LSNRPMTS_BAAS,这个在一众队列管理器中创建一个就好。但是这些队列管理器的端口不能一样;

TRPTYPE(TCP):传输协议类型为TCP;

PORT(4001):端口号为4001;

BACKLOG(0):侦听器支持的最大并发连接请求数,需要根据实际情况来确定;

CONTROL(QMGR):启动/停止控制方式为QMGR

(参数详情:

MANUAL:手动启动/停止

OMGR:随QM启动/停止

STARTONLY:随QM启动,不随其停止)

2)启动监听器

START LISTENER(LSNRPMTS_BAAS)

MQ配置实例:

crtmqm BAASDEC_RDMRCVS_GW

strmqm BAASDEC_RDMRCVS_GW

runmqsc BAASDEC_RDMRCVS_GW

ALTER QMGR CHLAUTH(DISABLED)

ALTER QMGR CONNAUTH(' ')

ALTER QMGR CLWLUSEQ(ANY)

ALTER QMGR CCSID(1208)

ALTER QMGR REPOS (BAASDEC)

REFRESH SECURITY TYPE(CONNAUTH)

DEFINE CHANNEL(BAASDEC_CVS_SVRCONN) CHLTYPE(SVRCONN) REPLACE

DEF LISTENER(LSNRPMTS_BAAS) TRPTYPE(TCP) PORT(4001) BACKLOG(0) CONTROL(QMGR) REPLACE

START LISTENER(LSNRPMTS_BAAS)

DEFINE CHANNEL (RDMRCVS.BAASDEC.CHL) CHLTYPE (RCVR) TRPTYPE(TCP) REPLACE

DEFINE QREMOTE (QMBAASDEC_CVS.CLUSTER) RNAME (' ') RQMNAME (' ') REPLACE

DEFINE CHANNEL(TO.BAASDEC_QM1) CHLTYPE(CLUSSDR) TRPTYPE(TCP) DISCINT(0) CONNAME('22.188.XXX.XXX(5X3X)') CLUSTER (BAASDEC) REPLACE

DEFINE CHANNEL(TO.BAASDEC_QM2) CHLTYPE(CLUSSDR) TRPTYPE(TCP) DISCINT(0) CONNAME('22.188.XXX.XXX(5X4X)') CLUSTER (BAASDEC) REPLACE

DEFINE CHANNEL(BAASDEC.RDMRCVS.CHL) CHLTYPE(SDR) TRPTYPE (TCP) DISCINT(0) CONNAME('22.188.XXX.XXX(1X1X)') XMITQ (BAASDEC_RDMRCVS_TRA)  REPLACE

DEFINE CHANNEL(TO.BAASDEC_GW) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) DISCINT(0) CONNAME('22.188.XXX.XXX(4X0X)') CLUSTER (BAASDEC) REPLACE

DEFINE QREMOTE (BAASDEC_RDMRCVS_REMOTEQ) RNAME (RDMRCVS.RECV.BAASDEC.QUEUE) RQMNAME (RDMRCVS.CLUSTER) XMITQ (BAASDEC_RDMRCVS_TRA) CLUSTER (BAASDEC) REPLACE

DEFINE QLOCAL (BAASDEC_RDMRCVS_TRA) USAGE (XMITQ) DEFPSIST(YES) MAXDEPTH(100000) TRIGGER TRIGTYPE(FIRST) INITQ(SYSTEM.CHANNEL.INITQ) TRIGDATA(BAASDEC.RDMRCVS.CHL) REPLACE

start channel(BAASDEC.RDMRCVS.CHL)

DEF QL(DEADQ) MAXDEPTH(290000) DEFPSIST(yes) REPLACE

ALTER QMGR DEADQ(DEADQ)

ALTER CHL(BAASDEC_CVS_SVRCONN) CHLTYPE(SVRCONN) MCAUSER('mqm')

 

查询:

1)dis qmgr或 dis qmgr all

显示队列管理器的全信息。

2)dis qmgr ccsid

显示队列管理器的部分属性信息。

3)dis q(*)

显示某个队列管理器下的全部队列。

4)dis q(*) all

显示某个队列管理器下的全部队列的全部信息。

5)dis ql(*) 和dis ql(*) all

显示某个队列管理器下的全部本地队列(的全部信息)。

6)dis qr(*) 和dis qr(*) all

显示某个队列管理器下的全部远程队列(的全部信息)。

7)dis q(name)

显示某个特定队列的全部信息。

8)dis q(name) CURDEPTH

显示某个特定队列的特定属性信息。

9)dis chl(*)

显示某个队列管理器下的通道信息。

10)dis chs(*)

显示某个队列管理器下的通道状态信息。

11)dis chs(name) curseqno

显示某个队列管理器下的某个通道的某个属性信息。

 

修改:

这块用来修改一些配置,知道特定的语法格式就好了

1)alter qmgr ccsid(1381)

将队列管理器的ccsid改成1381

2)alter ql(name) get (ENABLED)
将该队列管理器下的本地队列的get参数改为ENABLED。

 

概念:

1)通用:

队列管理器:简单的说就是一个大容器的管理员,这个大容器里放了很多东西。
队列:大容器里的东西,存放消息的盒子。
通道:大容器和大容器之间,程序和容器之间进行通讯的途径。

2)CCSID:

CCSID是一个涉及消息转换的字符集。作为unicode标准通过定义一个字符集内每个字符要对应那个数字值的方式定义了一个字符集。这说明CCSID就是一个定义字符集顺序的标识数码罢了。CCSID是IBM用来标识字符序列的标识代码。这个架构定义了SDCS(单字符集)的CCSID值,MBCS(多字符集)的CCSID值和混合单字符多字符集的混合CCSID值。多字符集的CCSID一般用于语言,比如中文,日文,韩文,这些语言的字符量很大,无法用单字节的码值来代表。
    CCSID间的转换有多种类型。其中一种转换就是从一种CCSID到另一种CCSID的转换,举例来说从ASCII(CCSID 1252)到EBCDIC(CCSID 37)。另一种是从串数据到另一种数据类型的转换。举例来说转换字符串数据到数值。在所有的这种类型的转换中都必须标识CCSID值来保证转换的正确进行。但是转换是有要求的,第一种转换的前提是转到的CCSID的类型中要包含转换前的CCSID类型中要转换的字符,比如,如果从CCSID1381(S-CHGBPC-DATA)类型的简体中文的PC编码中的一个中文字符"中"字到其他CCSID编码转换到的编码起码要求这个CCSID编码的字符集中包含同样的"中"字。WebSphere MQ 无法将 CCSID 1381 中标记的字符串数据转换为 CCSID 5488 中的数据。1381属于简体中文,5488属于GB18030,虽然都是中文,但是在语言集上是两个不相同的语言集,所以不能相互转换。实际上GB18030包含了简体中文,繁体中文以及几种少数民族的语言,后面两种字符都是在简体中文集中找不到对应映射的,所以不能转换。有一种可行的解决办法就是用UTF-8(1208)作为两种语言集的中介。

Linux下的MQ默认字符集是819。

Windows下的MQ默认字符集是1381。

3)MAXMSGL:消息大小
队列管理器MAXMSGL,默认值:4M,可以调整范围:32K - 100M;
通道MAXMSGL,默认值:4M,可以调整范围:0-队列管理器MAXMSGL;
队列MAXMSGL,默认值:4M,可以调整范围:0-队列管理器MAXMSGL;

队列MAXMSGL:仅对本地队列和模型队列有效,表示队列中可以容纳的最大消息长度,这个属性的调整范围在各个平台上的上限是不一样的。通道在建立 的时候会有一个握手过程,双方会交换各自通道定义上的MAXMSGL,最后协商出通道使用的最大消息长度,一般会取双方定义中较小的那一个。

 

运维:

对于消息队列来说运维主要就是看有没有通,能不能发报文。

1)检查网络:

如果是服务器之间的通信,需要首先看一下服务器之间的网络是否正常,如果网络不通的话是肯定没法发消息的,会报错2538。

2)检查配置

情况1:

无法将消息数据放到队列中
    一般这种情况应该大部分是远程队列中的传输队列那个参数配置的不正确,还有可能是队列的允许放入这个参数设置成了禁止或是队列堵塞了。检查队列属性的CURDEPTH达到MAXDEPTH值,如果CURDEPTH达到MAXDEPTH,表明队列深度已经达到最大值,这样就导致新的消息数据无法放入。

display queue(队列名) maxdepth curdepth

检查队列属性PUT是否为ENABLED,如果不是则说明队列不允许放入消息,可以用下面命令修改

alter qlocal(q_name) get (ENABLED)

情况2:

发送通道和接收通道的状态不是running

第一步:首先说明,如果长时间没有消息传输,通道的状态会变成不活动状态,这是正常现象。如果你手动启动通道后,通道状态还不是running,那先查看错误日志(两边的队列管理器都要查看)

对于查看错误日志:

如果进入到死信队列里:

/var/mqm/qmgrs/队列管理器名/errors可以看

查看死信队列里的报文:

/opt/mqm/samp/bin/amqsbcg DEADQ 队列管理器名

(/opt/mqm/samp/bin/amqsbcg是查看,不从队列里取出消息)

第二步:首先检查网络是否正常

我们可以执行mq中的一个命令来查看通道是不是正常
runmqsc 队列管理器名
ping chl(队列名)
ping操作来查看两边的通道是不是正常,如果正常会返回ping完成。

第三步:

停止通道,然后复位两端通道 RESET CHANNEL(channel_name) [ SEQNUM( 1 | integer) ]。复位完成后,启动通道。
如果还是不行,可以执行RESOLVE CHANNEL(channel_name) ACTION (BACKOUT)进行回退,ACTION有两个参数 BACKOUT和Commit, BACKOUT 将把可疑消息恢复到传输队列,而Commit将丢弃可疑消息。通常选择使用BACKOUT。

stop chl(队列名)
resolve chl(队列名) action(commit)
reset chl(队列名) seqnum(1)

以上的原因:可能是发送接收队列的消息序列号不一致。如果不一致做一下reset操作。
还有可能是上一批消息没有提交。可以做一个resolve操作。

3)查看队列和通道是否可以传输数据

如果有时候检查了之后不确定通道有没有好,可以通过以下来测试

首先dis chs(发送队列名),查看一下CURSEQNO的数值

然后使用$/opt/mqm/samp/bin/amqsput 远程队列名 队列管理器

发几个数,然后继续看dis chs(发送队列名) CURSEQNO是否增长,如果增长则说明通道是通的。

然后再看dis q(传输队列) CURDEPTH是否为0,如果为0表示消息发出了,如果不为0表示有消息积压。

 

附件:常用MQ指令

一、MQ命令集合
MQ命令集合有三种命令:控制命令、MQSC(MQ脚本命令)和PCF(Programmable Command Formats,可编程的命令格式)。

二、控制命令
控制命令:用于管理 WebSphere MQ的系统配置,包括队列管理器、侦听器、通道、日志的管理。
例如:创建队列管理器(crtmqm),启动队列管理器(strmqm),启动用于运行队列管理器MQSC命令的控制台(runmqsc)、运行通道(runmqchl)
对于Linux,WebSphere MQ 控制命令都从 shell输入和执行。

控制命令列表如下所示:
addmqinf(添加配置信息)
amqccert(检查证书链)
amqmdain(WebSphere MQ 服务控制)
amqmfsck(文件系统检查)
amqtcert(传送证书)
crtmqcvx(数据转换)
crtmqm(创建队列管理器)
dltmqm(删除队列管理器)
dmpmqaut(转储权限)
dmpmqlog(转储日志)
dspmq(显示队列管理器)
dspmqaut(显示权限)
dspmqcsv(显示命令服务器)
dspmqfls(显示文件)
dspmqinf(显示配置信息)
dspmqrte(WebSphere MQ 显示路由应用程序)
dspmqtrc(显示格式化的跟踪输出)
dspmqtrn(显示事务)
dspmqver(显示版本信息)
endmqcsv(结束命令服务器)
endmqlsr(结束侦听器)
endmqdnm(停止 .NET 监视器)
endmqm(结束队列管理器)
endmqtrc(结束跟踪)
migmbbrk(迁移发布/预订信息)
mqftapp(运行文件传输应用程序 GUI)
mqftrcv(在服务器上接收文件)
mqftrcvc(在客户机上接收文件)
mqftsnd(从服务器发送文件)
mqftsndc(从客户机发送文件)
rcdmqimg(记录介质映像)
rcrmqobj(重新创建对象)
rmvmqinf(除去配置信息)
rsvmqtrn(解决事务)
runmqchi(运行通道启动程序)
runmqchl(运行通道)
runmqdlq(运行死信队列处理程序)
runmqdnm(运行 .NET 监视器)
runmqlsr(运行侦听器)
runmqsc(运行 MQSC 命令)
runmqtmc(启动客户机触发器监视器)
runmqtrm(启动触发器监视器)
setmqaut(授予或撤销权限)
setmqcrl(设置证书撤销列表 (CRL) LDAP 服务器定义)
setmqprd(登记生产许可证)
setmqscp(设置服务连接点)
strmqcfg(启动 WebSphere MQ 资源管理器)
strmqcsv(启动命令服务器)
strmqm(启动队列管理器)
strmqtrc(启动跟踪)

三、MQSC
MQSC全称为MQ Script Command,MQ脚本命令
MQSC用于管理队列管理器对象,包括队列管理器本身、通道、队列、侦听器和进程定义。 
对于Linux,若要执行MQSC,则需要启动脚本命令控制台;启动方式:在shell执行控制命令runmqsc
WebSphere MQ V7.0 的MQSC列表如下所示:
ALTER AUTHINFO
ALTER BUFFPOOL
ALTER CFSTRUCT
ALTER CHANNEL
ALTER LISTENER
ALTER NAMELIST
ALTER PROCESS
ALTER PSID
ALTER QMGR
ALTER 队列
ALTER SECURITY
ALTER SERVICE
ALTER STGCLASS
ALTER SUB
ALTER TOPIC
ALTER TRACE
ARCHIVE LOG
BACKUP CFSTRUCT
CLEAR QLOCAL
CLEAR TOPICSTR
DEFINE AUTHINFO
DEFINE BUFFPOOL
DEFINE CFSTRUCT
DEFINE CHANNEL
DEFINE LISTENER
DEFINE LOG
DEFINE MAXSMSGS
DEFINE NAMELIST
DEFINE PROCESS
DEFINE PSID
DEFINE QUEUES
DEFINE SERVICE
DEFINE STGCLASS
DEFINE SUB
DEFINE TOPIC
DELETE AUTHINFO
DELETE BUFFPOOL
DELETE CFSTRUCT
DELETE CHANNEL
DELETE LISTENER
DELETE NAMELIST
DELETE PROCESS
DELETE PSID
DELETE QUEUES
DELETE SERVICE
DELETE SUB
DELETE STGCLASS
DELETE TOPIC
DISPLAY ARCHIVE
DISPLAY AUTHINFO
DISPLAY CFSTATUS
DISPLAY CFSTRUCT
DISPLAY CHANNEL
DISPLAY CHINIT
DISPLAY CHSTATUS
DISPLAY CLUSQMGR
DISPLAY CMDSERV
DISPLAY CONN
DISPLAY GROUP
DISPLAY LISTENER
DISPLAY LOG
DISPLAY LSSTATUS
DISPLAY MAXSMSGS
DISPLAY NAMELIST
DISPLAY PROCESS
DISPLAY PUBSUB
DISPLAY QMGR
DISPLAY QMSTATUS
DISPLAY QSTATUS
DISPLAY QUEUE
DISPLAY SBSTATUS
DISPLAY SECURITY
DISPLAY SERVICE
DISPLAY STGCLASS
DISPLAY SUB
DISPLAY SVSTATUS
DISPLAY SYSTEM
DISPLAY THREAD
DISPLAY TOPIC
DISPLAY TPSTATUS
DISPLAY TRACE
DISPLAY USAGE
MOVE QLOCAL
PING CHANNEL
PING QMGR
RECOVER BSDS
RECOVER CFSTRUCT
REFRESH CLUSTER
REFRESH QMGR
REFRESH SECURITY
RESET CHANNEL
RESET CLUSTER
RESET QMGR
RESET QSTATS
RESET TPIPE
RESOLVE CHANNEL
RESOLVE INDOUBT
RESUME QMGR
RVERIFY SECURITY
SET ARCHIVE
SET LOG
SET SYSTEM
START CHANNEL
START CHINIT
START CMDSERV
START LISTENER
START QMGR
START SERVICE
START TRACE
STOP CHANNEL
STOP CHINIT
STOP CMDSERV
STOP CONN
STOP LISTENER
STOP QMGR
STOP SERVICE
STOP TRACE
SUSPEND QMGR





 

posted on 2022-12-30 19:12  桌子哥  阅读(3132)  评论(0编辑  收藏  举报