jms之Message queue的互连互通

贴一篇半年前的老文, 主要涉及 MQ server基础设施中的分布式mq的互联互通.

一 mqsc命令基础:

1:创建队列管理器:
以管理员身份登陆websphere mq服务器,运行websphere MQ控制命令dspmq,显示已有队列管理器状态:

dspmq

 

比如项目用到的队列管理器是MQCOSMOS,如果没有,新建一个:

crtmqm –q MQCOSMOS

 

如果MQCOSMOS的状态为”Ended unexpected”,则需要启动它:

strmqm MQCOSMOS

 

停止消息管理器:

endmqm MQCOSMOS
 


启用MQSC命令:

runmqsc MQCOSMOS

 
显示该队列管理器下所有队列:

display qstatus(*)
 


查看queue中的消息数:

dis ql('YOUR.ONL.PROD.REQUEST') curdepth
 


创建本地message queue:

define qlocal(YOUR.ONL.DEV.DISPATCH)
 



查看通道定义:

display channel(*) trptype, convert
 



查看通道状态:

display chstatus(*) current
 



ping通道(只能在发送通道和服务器通道使用)

ping channel(SYSTEM.DEF.SENDER).
 



清空queue中的message:

CLEAR QLOCAL('myqueue');
 


值得注意的是:当此message queue正在被第三方使用时, clear命令不会自行成功(比如was的某个MDB正在使用此message queue时)

推荐定义死信队列:
查看mqm 中是否定义了死信队列:

 display qmgr DEADQ
 


返回:

   QMNAME(your_qmname)                  DEADQ( )
 


则: 定义一个队列:

DEFINE QLOCAL('MYDEADQ') DEFPSIST(YES) MAXDEPTH(20000) MAXMSGL(4194304) REPLACE  
 


把此队列设置为死信队列:

ALTER QMGR DEADQ('MYDEADQ') TRIGINT(10000)
 


再次查看:
display qmgr DEADQ
返回:
   QMNAME(your_qname)                  DEADQ(MYDEADQ)


结束mqsc:

End
 



二: 两个队列管理器实现双向通信需要的mqsc脚本。

1: 需求.

不在同一机器的两个队列管理器需要实现互联互通, 能够互发消息, 收消息.

2:实现概述

实现两个mqm的互联互通, 需要如下基础设施:


在源队列管理器上:
发送通道
远程队列定义
传输队列
死信队列

 

在目标队列管理器上:
接收通道
目标队列
死信队列

由于需要互联互通,是双向通讯, 则每一个mqm既是源队列, 也是目标队列, 以上设施都需要.

 

3: mqsc脚本

在本地队列管理器(QMA)中(eg: 本地ip: 192.168.10.222, remote ip: 192.168.10.154):

*echo "修改死信队列为DEADQ"
ALTER QMGR DEADQ('DEADQ') TRIGINT(10000)

*echo "定义远程队列"
DEFINE QREMOTE('QRB') DEFPSIST(YES) XMITQ('QMB') RNAME('QLB') RQMNAME('QMB') REPLACE

*echo "定义死信队列"
DEFINE QLOCAL('DEADQ') DEFPSIST(YES) MAXDEPTH(20000) MAXMSGL(4194304) REPLACE

*echo "定义本地接收队列"
DEFINE QLOCAL('QLA') DEFPSIST(YES) MAXDEPTH(100000) MAXMSGL(1048576) TRIGGER TRIGTYPE(FIRST) PROCESS('CICS.PRO') INITQ('SYSTEM.CICS.INITIATION.QUEUE') REPLACE

*echo "定义传输队列"
DEFINE QLOCAL('QMB') DEFPSIST(YES) MAXDEPTH(100000) MAXMSGL(1048576) USAGE(XMITQ) TRIGGER TRIGTYPE(FIRST) TRIGDATA('A.B') INITQ('SYSTEM.CHANNEL.INITQ') REPLACE

*echo "修改system.cics.initiation.queue队列的属性"
ALTER QLOCAL('SYSTEM.CICS.INITIATION.QUEUE') DESCR('WebSphere MQ Default CICS Initiation queue') DEFPSIST(YES) MAXDEPTH(100000) MAXMSGL(1000)

*echo "定义接收通道"
DEFINE CHANNEL('B.A') CHLTYPE(RCVR) TRPTYPE(TCP) BATCHSZ(50) HBINT(300) MRRTY(10) MRTMR(1000) REPLACE

*echo "定义发送通道"
DEFINE CHANNEL('A.B') CHLTYPE(SDR) TRPTYPE(TCP) BATCHSZ(50) CONNAME('192.168.10.154') DISCINT(1800) HBINT(300) LONGRTY(999999999) LONGTMR(300) SHORTRTY(10000) SHORTTMR(30) XMITQ('QMB') REPLACE
DEFINE CHANNEL('SYSTEM.ADMIN.SVRCONN') CHLTYPE(SVRCONN) TRPTYPE(TCP) HBINT(300) MAXMSGL(4194304) MCAUSER('mqm') REPLACE

*echo "定义接收进程"
DEFINE PROCESS('CICS.PRO') REPLACE APPLTYPE(CICS) APPLICID('TEST')

 

 在远程队列管理器(QMB)中:

*echo "修改死信队列为DEADQ"
ALTER QMGR DEADQ('DEADQ') TRIGINT(10000)

*echo "定义远程队列"
DEFINE QREMOTE('QRA') DEFPSIST(YES) XMITQ('QMA') RNAME('QLA') RQMNAME('QMA') REPLACE

*echo "定义死信队列"
DEFINE QLOCAL('DEADQ') DEFPSIST(YES) MAXDEPTH(20000) MAXMSGL(4194304) REPLACE

*echo "定义本地接收队列"
DEFINE QLOCAL('QLB') DEFPSIST(YES) MAXDEPTH(100000) MAXMSGL(1048576) TRIGGER TRIGTYPE(FIRST) PROCESS('CICS.PRO') INITQ('SYSTEM.CICS.INITIATION.QUEUE') REPLACE

*echo "定义传输队列"
DEFINE QLOCAL('QMA') DEFPSIST(YES) MAXDEPTH(100000) MAXMSGL(1048576) USAGE(XMITQ) TRIGGER TRIGTYPE(FIRST) TRIGDATA('B.A') INITQ('SYSTEM.CHANNEL.INITQ') REPLACE

*echo "修改system.cics.initiation.queue队列的属性"
ALTER QLOCAL('SYSTEM.CICS.INITIATION.QUEUE') DESCR('WebSphere MQ Default CICS Initiation queue') DEFPSIST(YES) MAXDEPTH(100000) MAXMSGL(1000)

*echo "定义接收通道"
DEFINE CHANNEL('A.B') CHLTYPE(RCVR) TRPTYPE(TCP) BATCHSZ(50) HBINT(300) MRRTY(10) MRTMR(1000) REPLACE

*echo "定义发送通道"
DEFINE CHANNEL('B.A') CHLTYPE(SDR) TRPTYPE(TCP) BATCHSZ(50) CONNAME('192.168.10.222') DISCINT(1800) HBINT(300) LONGRTY(999999999) LONGTMR(300) SHORTRTY(10000) SHORTTMR(30) XMITQ('QMA') REPLACE
DEFINE CHANNEL('SYSTEM.ADMIN.SVRCONN') CHLTYPE(SVRCONN) TRPTYPE(TCP) HBINT(300) MAXMSGL(4194304) MCAUSER('mqm') REPLACE

*echo "定义接收进程"
DEFINE PROCESS('CICS.PRO') REPLACE APPLTYPE(CICS) APPLICID('TEST')
 

三: 实现两个队列管理器互联互通的最后一步是在本地和远程启动相应的监听程序,端口号为1414。(操作系统: linux)

进入/etc/xinetd.conf(路径不清楚, 可用find ./ -name amqcrsta 查找),
编辑该文件:

gedit /etc/xinetd.conf

 
在文中增加如下:

# D20080423
WebSphere MQ stream tcp nowait mqm /opt/mqm/maintenance/6.0.2.2/MQSeriesServer/backup/opt/mqm/bin/amqcrsta amqcrsta [-m Queue_Man_Name]
# D20080423 END
 

另外, 还要需要修改/etc/services文件, 对MQ 开放1414端口(root或超级用户才有权限修改)
在该文件中增加:

WebSphere MQ    1414/tcp            # used by was mq

 
为使修改生效, 需重启xinet进程
查找该进程

ps -elf |grep xinet

 
kill它:

kill -9 788

 
运行WebSphere MQ提供的监听程序:

runmqlsr -m QMB -t TCP

 
启动xinetd(start | stop | status)

[root@P222 ~]# service xinetd start

 
四: 测试queue通讯:
1.切换到MQ安装目录
2.进入samp/bin
3. 执行amqsput q_name mqm_name进入发送器

amqsput QRB QMA

 4. 发消息
5. 执行 amqsget q_name mqm_name进入接收器

amqsget QLB QMB

 

BTW: 提供一个好的mq客户端软件, 便于测试:

MQ Visual Edit:

http://www.capitalware.biz/

为了远程连接成功, 需要采用client模式, mqm中需要设置一个类型为SVRCONN的channel,详细内容请看:

jms: client方式访问message queue

http://lcllcl987.iteye.com/admin/blogs/221654

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值