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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章