消息隊列+發送隊列+消息通道
接收通道名稱與發送端的發送通道名稱要一致,修改通道信息后要執行 start channle(chlname) 重啟通道。
常用的MQ命令
66.0.42.240 用戶 mqm/mqm
88.0.52.40 mq隊列服務器:mqm/1qaz2wsx
二代:88.0.65.91 vlog/1qaz2wsx
監控:/cnaps/maintain/bin
管理台:admin/698825 240環境:admin/123456 698825
通訊前置:88.0.65.94 pmts+1qaz2wsx
查看隊列屬性 pmtsstat [disp] qrinfo
關閉gaps: gapsshutdown.sh
開啟gaps: gapsboot.sh
/* MQ創建 */
顯示隊列管理器 dspmq
進入隊列管理器控制台 runmqsc 隊列管理器名
顯示通道狀態 dis chs(*)
顯示通道 dis chl(*)
啟動mq通道報錯如下信息,為CCSID錯誤
The local and remote queue managers do not agree on the next message sequence
number. A message with sequence number 214 has been sent when sequence number
使用命令重置CCSID可行reset chl(MBA.MBFEA) seqnum(819)
STATUS(BINDING)
主要是看mqm
創建mq: crtmqm -q qmgrname
-q是指創建缺省的隊列管理器
刪除mq: dltmqm qmgrname
啟動mq: strmqm qmgrname
停止mq: endmqm qmgrname 受控停止
endmqm -i qmgrname 立即停止
endmqm -p qmgrname 強制停止
顯示隊列管理器 dspmq -m qmgrname
運行mqseries命令(啟動用於運行隊列管理器MQSC命令的控制台(runmqsc)) runmqsc qmgrname
往隊列中放消息 amqsput qname qmgrname
從隊列中取消息 amqsget qname qmgrname
啟動通道 runmqchl -c ChlName -m QmgrName
啟動偵聽 runmqlsr -t Type -p Port -m QMgrName
停止偵聽 endmqlsr -m QmgrName
MQSeries命令
顯示隊列的所有屬性 DISPLAY QUEUE (QName) [ALL]
顯示隊列的所選屬性 DISPLAY QUEUE (QName)DESCR GET PUT
DISPLAY QUEUE (QName)MAXDEPTH CURDEPT
顯示隊列管理器的所有屬性 DISPLAY QMGR[ALL]
mq配置信息:根目錄的mqs.ini(mq配置文件) qm.ini(隊列管理器配置文件,它的屬性僅影響某個隊列管理器,在節點中的每個隊列管理器都有一個qm.ini,所在目錄 ./pmts/qmgrs/QMUMBFEA/qm.ini)
查看通道狀態
DISPLAY CHSTATUS(*) CURRENT
MQ屬性
隊列管理器名稱、隊列、進程、名稱列表、群集、認證信息對象 最長48個字符,通道名最長20個字符,隊列名區分大小寫,所有控制命令區分大小寫
USAGE(NORMAL/XMITQ):
BOTHRESH 和 BOQNAME屬性:當處理backout消息時,
如4 中所言,如果某個消息是在同步點控制之下讀取的,並且由於某種原因消息被回滾,消息描述符中的BackoutCount字段的值將被加1,你需要判斷該數值,如果它大於某個閾值,你需要使用其它手段來處理該消息。在處理該消息的應用中,你可以將其與設定的閾值做比較,這時,閾值會被寫死在程序中,為了提高其靈活性,你可以使用隊列的BOTHRESH 和 BOQNAME屬性。這樣,你可以在例外處理中,利用MQINQ查詢得到閾值的大小,如果超出,可以將消息轉發到BOQNAME指定的隊列中,繼而對該隊列進行相應的處理。這種方法大大增強了應用程序的靈活性。
DESCR:描述
MAXMSGL:消息大小
隊列管理器MAXMSGL,默認值:4M,可以調整范圍:32K - 100M;
通道MAXMSGL,默認值:4M,可以調整范圍:0-隊列管理器MAXMSGL;
隊列MAXMSGL,默認值:4M,可以調整范圍:0-隊列管理器MAXMSGL;
使用alter命令,即可對其MAXMSGL進行修改。
三者之間的關系:
隊列管理器MAXMSGL>=隊列MAXMSGL;
通道MAXMSGL:
隊列MAXMSGL:僅對本地隊列和模型隊列有效,表示隊列中可以容納的最大消息長度,這個屬性的調整范圍在各個平台上的上限是不一樣的。通道在建立 的時候會有一個握手過程,雙方會交換各自通道定義上的MAXMSGL,最后協商出通道使用的最大消息長度,一般會取雙方定義中較小的那一個。
系統缺省對象:
系統缺省對象是一組每次創建隊列管理器時自動創建的對象定義。您可以復制和修改這些對象定義中的任何一個,以在安裝時用於應用程序。
缺省對象名具項SYSTEM.DEFAULT;例如,缺省本地隊列是SYSTEM.DEFAULT.LOCAL.QUEUE,並且缺省接收方通道是SYSTEM.DEFAULT.RECEIVER。您無法重命名這些對象;這些名稱的缺省對象是必需的。
當您定義對象時,從相應的缺省對象復制您不明確指定的任何屬性。例如,如果您定義本地隊列,則從缺省隊列SYSTEM.DEFAULT.LOCAL.QUEUE 獲取您未指定的那些屬性。
請參閱附錄1, "系統和缺省對象"以獲取關系統缺省的更多信息。
-------------------------------------------------------------------------------------------------------------------------------------------
win下使用 dspmq.exe
uninx/linux 下
#su - mqm
#dspmq
最近在配置MQ,記下了一些常用的MQ命令,如下:
創建隊列管理器
crtmqm –q QMgrName
刪除隊列管理器
dltmqm QmgrName
啟動隊列管理器
strmqm QmgrName
如果是啟動默認的隊列管理器,可以不帶其名字
停止隊列管理器
endmqm QmgrName 受控停止
endmqm –i QmgrName 立即停止
endmqm –p QmgrName 強制停止
顯示隊列管理器
dspmq –m QmgrName
往隊列中放消息
amqsput QName QmgrName
如果隊列是默認隊列管理器中的隊列,可以不帶其隊列管理器的名字
從隊列中取出消息
amqsget QName QmgrName
如果隊列是默認隊列管理器中的隊列,可以不帶其隊列管理器的名字
啟動通道
runmqchl –c ChlName –m QmgrName
啟動偵聽
runmqlsr –t TYPE –p PORT –m QMgrName
停止偵聽
endmqlsr -m QmgrName
下面是在MQ環境中可以執行的MQ命令(即在runmqsc環境下可以敲的命令)
定義持久信隊列
DEFINE QLOCAL(QNAME) DEFPSIST(YES) REPLACE
DEFPSIST:隊列中消息持久性默認值。
NO 該隊列上的消息在隊列管理器重新啟動時丟失
YES 該隊列上的消息在隊列管理器重新啟動時保存了下來。
關於消息在隊列中的保存時間:消息在隊列的保存時間與個設置關:隊列defpsist屬性、消息Persistence持久性屬性和消息Expiry消息到期時間屬性,其中隊列defpsist 屬性是在創建隊列時設置,消息Persistence和Expiry屬性是應用程序往隊列放入消息時指定。消息本身的Persistence值優先於隊列defpsist值。Expiry指消息到期 時間,即經過指定的時間后,消息如果還沒被取走,此消息將過期(無效。消息過期后,可能會自動從隊列中刪除(取決於不同操作系統的MQ實現。對於非持久性消息, 即使Expiry設為永不過期,重啟隊列管理器時,消息也將丟失。
定義隊列允許的最大消息數目
MAXDEPTH
maxdepth:隊列上允許的最大消息數;
設定隊列管理器的持久信隊列
ALTER QMGR DEADQ(QNAME)
定義本地隊列
DEFINE QL(QNAME) REPLACE
定義別名隊列
DEFINE QALIAS(QALIASNAME) TARGQ(QNAME)
遠程隊列定義
DEFINE QREMOTE(QRNAME) +
RNAME(AAA) RQMNAME(QMGRNAME) +
XMITQ(QTNAME)
定義模型隊列
DEFINE QMODEL(QNAME) DEFTYPE(TEMPDYN)
定義本地傳輸隊列
DEFINE QLOCAL(QTNAME) USAGE(XMITQ) DEFPSIST(YES) +
INITQ(SYSTEM.CHANNEL.INITQ)+
PROCESS(PROCESSNAME) REPLACE
創建進程定義
DEFINE PROCESS(PRONAME) +
DESCR(‘STRING’)+
APPLTYPE(WINDOWSNT)+
APPLICID(’ runmqchl -c SDR_TEST -m QM_ TEST’)
其中APPLTYPE的值可以是:CICS、UNIX、WINDOWS、WINDOWSNT等
創建發送方通道
DEFINE CHANNEL(SDRNAME) CHLTYPE(SDR)+
CONNAME(‘100.100.100.215(1418)’) XMITQ(QTNAME) REPLACE
其中CHLTYPE可以是:SDR、SVR、RCVR、RQSTR、CLNTCONN、SVRCONN、CLUSSDR和CLUSRCVR。
創建接收方通道
DEFINE CHANNEL(SDR_ TEST) CHLTYPE(RCVR) REPLACE
創建服務器連接通道
DEFINE CHANNEL(SVRCONNNAME) CHLTYPE(SVRCONN) REPLACE
顯示隊列的所有屬性
DISPLAY QUEUE(QNAME) [ALL]
顯示隊列的所選屬性
DISPLAY QUEUE(QNAME) DESCR GET PUT
DISPLAY QUEUE(QNAME)MAXDEPTH CURDEPTH
顯示隊列管理器的所有屬性
DISPLAY QMGR [ALL]
顯示進程定義
DISPLAY PROCESS(PRONAME)
更改屬性
ALTER QMGR DESCR(‘NEW DESCRIPTION’)
ALTER QLOCAL(QNAME) PUT(DISABLED)
ALTER QALIAS(QNAME) TARGQ(TARGQNAME)
刪除隊列
DELETE QLOCAL(QNAME)
DELETE QREMOTE(QRNAME)
清除隊列中的所有消息
CLEAR QLOCAL(QNAME)
以下是一些高級配置的命令:
amqmcert 配置SSL證書
amqmdain 配置windows上的MQ服務
crtmqcvx 轉換數據
dmpmqaut 轉儲對象權限管理
dmpmqlog 轉儲日志管理
dspmq 顯示隊列管理器
dspmqaut 顯示打開對象的權限
dmpmqcap 顯示處理程序容量和處理程序數
dspmqcsv 顯示命令服務器狀態
dspmqfls 顯示文件名
dspmqtrc 跟蹤MQ輸出(HP-UNIX LINUX Solaris)
dspmqrtn 顯示事務的詳細信息
endmqcsv 停止隊列管理器上的命令服務器
strmqcsv 啟動隊列管理器上的命令服務器
endmqtrc 停止跟蹤
rcdmqimg 向日志寫對象的映像
rcmqobj 根據日志中的映像重新創建一個對象
rsvmqtrn 提交或逆序恢復事務
MQ 控制命令的參考信息。
addmqinf
添加 WebSphere MQ 配置信息(僅限於 Windows? 和 UNIX 平台)。
amqccert
檢查不完整的證書鏈(僅限於 Windows)。
amqmdain
配置或控制 WebSphere MQ 服務控制(僅限於 Windows)。
amqmfsck(文件系統檢查)
檢查文件系統是否與 POSIX 標准一致並能夠共享隊列管理器數據以支持多實例隊列管理器。
amqtcert
從 WebSphere MQ 5.3 或 5.3.1 遷移證書(僅限於 Windows)。
crtmqcvx
根據數據類型結構來創建數據轉換代碼。
crtmqm
創建隊列管理器。
dltmqm
刪除隊列管理器。
dmpmqaut
轉儲一組 WebSphere MQ 對象類型和概要文件的當前權限列表。
dmpmqlog
顯示並格式化 WebSphere MQ 系統日志的部分內容。
dspmq
顯示關於隊列管理器的信息。
dspmqaut
dspmqaut 顯示特定 WebSphere MQ 對象的權限。
dspmqcsv
顯示命令服務器的狀態
dspmqfls
顯示與 WebSphere MQ 對象相對應的文件名。
dspmqinf
顯示 WebSphere MQ 配置信息(僅限於 Windows 和 Unix 平台)。
dspmqrte
確定消息通過隊列管理器網絡時采用的路由。
dspmqtrc
格式化並顯示 WebSphere MQ 跟蹤(僅限於 Unix 平台)。
dspmqtrn
顯示不確定的事務。
dspmqver
顯示 WebSphere MQ 版本和構建信息。
endmqcsv
為隊列管理器停止命令服務器。
endmqlsr
結束隊列管理器的所有偵聽器進程。
endmqdnm
對某個隊列停止 .NET 監視器(僅限於 Windows)。
endmqm
停止隊列管理器或者切換到備用隊列管理器。
endmqtrc
對所跟蹤的某些或全部實體結束跟蹤。
migmbbrk
migmbbrk 命令將發布/預訂配置數據從 WebSphere Event Broker V6.0 或者 WebSphere Message Broker V6.0 或 V6.1 遷移到 WebSphere MQ V7.0.1 或更高版本。
mqftapp
啟動文件傳輸應用程序的圖形界面(僅限於 Windows 和 Linux x86 平台)。
mqftrcv
處理在服務器上使用 WebSphere MQ 文件傳輸應用程序接收到的文件(僅限於 Windows 和 Linux x86 平台)。
mqftrcvc
處理在客戶機上接收到的文件(僅限於 Windows 和 Linux x86 平台)。
mqftsnd
使用 WebSphere MQ 文件傳輸應用程序從服務器發送文件(僅限於 Windows 和 Linux x86 平台)。
mqftsndc
使用 WebSphere MQ 文件傳輸應用程序從客戶機發送文件(僅限於 Windows 和 Linux x86 平台)。
rcdmqimg
將一個對象或一組對象的映像寫入日志,以便進行介質恢復。
rcrmqobj
根據日志中包含的一個或一組對象的映像來重新創建這些對象。
rmvmqinf
除去 WebSphere MQ 配置信息(僅限於 Windows 和 Unix 平台)。
rsvmqtrn
解決不確定的事務。
runmqchi
運行通道啟動程序進程,以便自動啟動通道。
runmqchl
啟動發送方或請求方通道
runmqdlq
啟動死信隊列處理程序,以便監視和處理死信隊列中的消息。
runmqdnm
使用 .NET 監視器來開始處理某個隊列中的消息(僅限於 Windows)。
runmqlsr
運行偵聽器進程,以便偵聽各種通信協議的遠程請求。
runmqsc
對隊列管理器運行 WebSphere MQ 命令。
runmqtmc
在客戶機上啟動觸發器監視器。
runmqtrm
在服務器上啟動觸發器監視器。
setmqaut
更改概要文件、對象或對象類的權限。可以對任意數目的主體或組授予權限或從中撤銷權限。
setmqcrl
在 Active Directory 中管理 CRL(證書撤銷列表)LDAP 定義(僅限於 Windows)。
setmqprd
登記 WebSphere MQ 生產許可證。
setmqscp
在 Active Directory 中發布客戶機連接通道定義(僅限於 Windows)。
strmqcfg
啟動 WebSphere MQ 資源管理器(僅限於 Windows 和 Linux x86 平台)。
strmqcsv
為隊列管理器啟動命令服務器。
strmqm
啟動隊列管理器或者使其准備好執行備用操作。
strmqtrc
常用命令
創建隊列管理器
crtmqm –q QMgrName
-q是指創建缺省的隊列管理器
刪除隊列管理器
dltmqm QmgrName
啟動隊列管理器
strmqm QmgrName
如果是啟動默認的隊列管理器,可以不帶其名字
停止隊列管理器
endmqm QmgrName 受控停止
endmqm –i QmgrName 立即停止
endmqm –p QmgrName 強制停止
顯示隊列管理器
dspmq –m QmgrName
運行MQSeries命令
runmqsc QmgrName
如果是默認隊列管理器,可以不帶其名字
往隊列中放消息
amqsput QName QmgrName
如果隊列是默認隊列管理器中的隊列,可以不帶其隊列管理器的名字
從隊列中取出消息
amqsget QName QmgrName
如果隊列是默認隊列管理器中的隊列,可以不帶其隊列管理器的名字
啟動通道
runmqchl –c ChlName –m QmgrName
啟動偵聽
runmqlsr –t TYPE –p PORT –m QmgrName
停止偵聽
endmqlsr -m QmgrName
MQSeries命令
定義死信隊列
DEFINE QLOCAL(QNAME) DEFPSIST(YES) REPLACE
設定隊列管理器的死信隊列
ALTER QMGR DEADQ(QNAME)
定義本地隊列
DEFINE QL(QNAME) REPLACE
定義別名隊列
DEFINE QALIAS(QALIASNAME) TARGQ(QNAME)
遠程隊列定義
DEFINE QREMOTE(QRNAME) +
RNAME(AAA) RQMNAME(QMGRNAME) +
XMITQ(QTNAME)
定義模型隊列
DEFINE QMODEL(QNAME) DEFTYPE(TEMPDYN)
定義本地傳輸隊列
DEFINE QLOCAL(QTNAME) USAGE(XMITQ) DEFPSIST(YES) +
INITQ(SYSTEM.CHANNEL.INITQ)+
PROCESS(PROCESSNAME) REPLACE
創建進程定義
DEFINE PROCESS(PRONAME) +
DESCR(‘STRING’)+
APPLTYPE(WINDOWSNT)+
APPLICID(’ runmqchl -c SDR_TEST -m QM_ TEST’)
其中APPLTYPE的值可以是:CICS、UNIX、WINDOWS、WINDOWSNT等
創建發送方通道
DEFINE CHANNEL(SDRNAME) CHLTYPE(SDR)+
CONNAME(‘100.100.100.215(1418)’) XMITQ(QTNAME) REPLACE
其中CHLTYPE可以是:SDR、SVR、RCVR、RQSTR、CLNTCONN、SVRCONN、CLUSSDR和CLUSRCVR。
創建接收方通道
DEFINE CHANNEL(SDR_ TEST) CHLTYPE(RCVR) REPLACE
創建服務器連接通道
DEFINE CHANNEL(SVRCONNNAME) CHLTYPE(SVRCONN) REPLACE
顯示隊列的所有屬性
DISPLAY QUEUE(QNAME) [ALL]
顯示隊列的所選屬性
DISPLAY QUEUE(QNAME) DESCR GET PUT
DISPLAY QUEUE(QNAME)MAXDEPTH CURDEPTH
顯示隊列管理器的所有屬性
DISPLAY QMGR [ALL]
顯示進程定義
DISPLAY PROCESS(PRONAME)
更改屬性
ALTER QMGR DESCR(‘NEW DESCRIPTION’)
ALTER QLOCAL(QNAME) PUT(DISABLED)
ALTER QALIAS(QNAME) TARGQ(TARGQNAME)
刪除隊列
DELETE QLOCAL(QNAME)
DELETE QREMOTE(QRNAME)
清除隊列中的所有消息
CLEAR QLOCAL(QNAME)
常用補充命令
顯示隊列管理器 dspmq
顯示文件名 dspmqfls
啟動本地隊列管理器 strmqm
結束本地隊列管理器 endmqm
啟動通道啟動進程 runmqchi/runmqchl
MQ常用的一些管理操作
發布: 2008-12-15 10:49 | 作者: 胡偉紅 | 來源: 本站原創 | 查看: 28次
覺得很有參考價值,跟大家分享。
1. 安裝好MQ之后,本身MQ會給你提供一些src的sample,有些是非常有用的,前提是你要裝sample,可以將那些src的東東按照自己的需求
修改后編譯使用,exam(linux):gcc -o destname srcname -lmqm
2. 生產環境的QM由於某種需求,要更換服務器,又要保證在很短的時間內切換完成,那么怎么將原有定義的mq資源導出來,並形成ddl腳本呢?IBM提供了這么一個簡單有效的導出工具(里面又各種平台的導出腳本),可以在ibm官方網站上搜索ms03,將它下載下來使用;注意要啟動MQ的commandserver
strmqcsv QMname
exam(linux):
tar -zxvf ms03.tar.Z
ls
make -f makefile.linux
ldaf s
ls *.TST
./saveqmgr.linux -m TIANJIN_QM -v '53'
VI SAVEQMGR.TST
導出命令saveqmgr.linux會在本目錄下生成一個SAVEQMGR.TST的文件里面就是所有QM對象資源的定義。
3. 常用命令備忘
#修改通道
alter CHANNEL(GUOJIA_SHENZHEN) CHLTYPE(SDR) CONNAME('10.12.131.12(1414)') XMITQ(GUOJIA_SHENZHEN_XMIT) DISCINT(0) TRPTYPE(TCP)
#啟動通道(runmqsc)
start chl(通道名稱)
#檢察通道狀態
dis chs(GUIZHOU_GY_GUOJIA)
#允許遠程客戶端管理器連接
su - mqm
runmqsc QM
ALTER CHANNEL (SYSTEM.ADMIN.SVRCONN) CHLTYPE (SVRCONN) MCAUSER ("mqm")
#啟動一個QM
strmqm Heaven
#啟動一個QM的command server
strmqcsv Heaven
#啟動一個偵聽
runmqlsr -m Heaven -t TCP -p 1415 &
#停止隊列管理器
endmqm QmgrName 受控停止
endmqm –i QmgrName 立即停止
endmqm –p QmgrName 強制停止
# 顯示QM的狀態
dspmq –m QmgrName
#channel不通的解決辦法
runmqsc
stop chl(guojia_hainan)
resolve chl(guojia_hainan) action(commit)
reset chl(guojia_hainan) seqnum(1)
# 創建缺省隊列管理器,擁有1000個句柄, 使用線性循環日志,容量為 10240 × 4 K / 文件, 主文件30個,輔文件32個
crtmqm -t 5000 -h 1000 -lc -lf 10240 -lp 30 -ls 32 Heaven
# 設置cpu個數為1
setmqcap 1
# 從配置文件中讀入初始化命令
runmqsc Heaven < mqconfig.txt
#創建完QM之后在/var/mqm/qmgrs/[Your Queue Manager Name]/qm.ini文件最后加入以下行:
Channels:
AdoptNewMCA=ALL
MaxChannels=1000
MaxActiveChannels=1000
#如何清除MQ 隊列管理器遺留的共享內存和信號量
解決方法:運行以下腳本或命令。
ipcs -m| grep mqm | awk '{print $2}'|xargs -i ipcrm -m {}
ipcs -s| grep mqm | awk '{print $2}'|xargs -i ipcrm -s {}
mq經驗總結
首先了解什么是mq?mq的作用是什么?
mq是通訊中間件。他的作用是省去開發人員開發通訊工具的時間,節省開發成本,提高開發效
率。
mq的使用,如何安裝mq?
根據以往的經驗,win版的mq比較容易安裝,傻瓜式,一路next就可以。
aix版本的用smitty安裝。
linux版本用rpm -ivh 安裝
mq中一些名稱的概念:
隊列管理器:簡單的說就是一個大容器的管理員,這個大容器里放了很多東西。
隊列:大容器里的東西,存放消息的盒子。
通道:大容器和大容器之間,程序和容器之間進行通訊的途徑。
mq是如何實現通訊的?
mq的通訊方式有兩種,通俗的說就是mq之間進行通訊,開發的程序和mq之間的通訊。
mq之間進行通訊:通過發送接收通道建立tcp連接進行消息傳輸,稱為server對server
開發的程序和mq之間的通訊:通過服務器連接通道進行傳輸,client對server
如何配置兩台mq使之相互進行通訊?
首先要規划好兩個隊列管理器之間使用的ip和端口,假設我們使用
ip 端口
192.168.0.1 1414
192.168.0.2 1415
第一步 建立隊列管理器
crtmqm -lc -lf 100 -lp 3 -ls 3 QM1
解釋下:
-lc 是采用循環日志
-lf 是每塊日志的大小,4k為單位的,100就是100*4k
-lp 是主邏輯日志的數量
-ls 是輔邏輯日志的數量
QM1 是隊列管理器名稱
第二步 啟動隊列管理器
strmqm QM1
第三步 定義隊列管理器中的隊列和通道等
先運行runmqsc QM1首先要保證運行該命令的用戶屬於mqm組
運行完后進入mq命令窗口
定義本地隊列 def ql(QL1)
先解釋什么是本地隊列,然后解釋命令的含義(以下同)
本地隊列是存儲信息的盒子,用戶可以從本地隊列里取消息,對方發送消息的目的地也是本地
隊列。
def是 define的縮寫,mq支持一些命令的縮寫。
ql是queue local的縮寫,表示本地隊列,括號內是本地隊列名
定義遠程隊列 def qr(QR1) rname(QL2) rqname(QM2) xmitq(QT1)
遠程隊列是相對於本地隊列的,當用戶希望往另一個隊列管理器發消息的時候,配置好遠程隊
列,用戶直接放消息到該隊列就可以,mq會傳輸到另一方的本地隊列中。
以上面的例子說明,當我們把消息放入該遠程隊列后,消息會傳輸到QM2隊列管理器中的QL2隊
列中。
qr queue remote的縮寫
rname 指定的遠程隊列管理器上的隊列名
rqname 遠程隊列管理器
xmitq 所要用的傳輸隊列
定義傳輸隊列 def ql(QT1) usage(xmitq) trigger trigtype(first) initq
(system.channel.initq) trigdata(QM1.QM2)
傳輸隊列是傳輸的介質,消息是通過傳輸隊列進行傳輸的。
usage 用途xmitq是傳輸隊列
trigger 消息觸發開關
trigtype 觸發類型第一條消息觸發
initq 初始隊列
trigdata 觸發數據
定義發送通道 def chl(QM1.QM2) chltype(sdr) conname('192.168.0.2(1415)') trptype
(tcp) xmitq(QT1)
發送通道就相當於建立一個tcp的連接
chl channel的縮寫
chltype 通道類型sdr是發送通道
conname 連接名包括對方的ip和端口
trptype 通訊類型tcp通訊
xmitq 使用的傳輸隊列
定義接受通道 def chl(QM2.QM1)
接收通道是被動的,只定義名字就可以。大家注意,接收通道的名字一定要和發送通道名一致
,他們是靠名字來匹配。
第四步 配置監聽器
是對方mq管理器來探測,本地要給對方一個回應,監聽器就是起這個作用的。
如果是5.3版本 只能在命令行里運行 runmqlsr -m QM1 -t tcp -p 1414
如果是6.0版本 可以runmqsc QM1里運行 def listener(LSR.QM1) trptype(tcp) port(1414)
control(qmgr)
解釋下 trptype 監聽類型
port 監聽端口
control 監聽控制,如果是qmgr則在隊列管理器啟動的時候監聽也自動啟動。
第五步 配置另外一個隊列管理器
簡單的說一下,和上面的差不多,只不過名字不一樣。大家自己嘗試下:)
寫的手累了,下次補充!
繼續
上面我們說完了如何建隊列管理器,接下來我們說說建完以后如何測試兩邊是不是正常傳輸,
我們可以用命令行方式向遠程隊列中放入測試消息,以aix為例,
用/usr/mqm/samp/bin/amqsput命令就可以放入消息,格式為:
amqsput QR1 QM1
解釋下:QR1是你要放入的隊列名,QM1是你要放入的隊列管理器名。
輸入以上命令后就可以寫入消息了,一下回車就是發送一條消息,兩次回車就是退出。
用/usr/mqm/samp/bin/amqsget命令就可以取消息,格式為
amqsget QL2 QM2
解釋下:QL1是你要取消息的隊列名,QM2是你要取消息的隊列管理器名。
輸入完命令后就會顯示所有消息。
不過要注意一點,命令行方式的輸入和取消息有字節限制。
如果只是簡單的瀏覽一下消息可以使用
/usr/mqm/samp/bin/amqsbcg命令
格式和取消息一樣,但是該命令不會把消息取出來,運行完該命令后消息還是保存在隊列中。
正常情況下消息的傳輸流程(只說正常的,排錯一會再說)
QR1 -> QT1 -> QL2
消息被放入到遠程隊列中,遠程隊列通過傳輸隊列傳輸,最后傳輸到QM2中的本地隊列。
出現問題,我們怎么辦?
1 不能放入消息。
一般這種情況應該大部分是遠程隊列中的傳輸隊列那個參數配置的不正確。
還有可能是隊列的允許放入這個參數設置成了禁止。基本上就這兩種情況。
2 發送通道和接收通道的狀態不是running
首先說明,如果長時間沒有消息傳輸,通道的狀態會變成不活動狀態,這是正常現象。
如果你手動啟動通道后,通道狀態還不是running,那先查看錯誤日志(兩邊的隊列管理器都要查看)
/var/mqm/qmgrs/QM1/errors中的錯誤日志,通常編號01的日志是最新日志。
常見情況是網絡不通導致的通道不通!所以首先要保證網絡是正常的,我們可以同過telnet對方的IP加監聽端口的方法來查看是不是正常。
telnet 192.168.0.2 1415
再有的情況是兩邊的配置屬性有問題,如兩邊發送和接收通道名不一致,發送通道的連接名配置錯誤,發送通道中的傳輸隊列配置錯誤。
我們也可以執行mq中的一個命令來查看通道是不是正常
runmqsc QM1
ping chl(QM1.QM2)
ping操作來查看兩邊的通道是不是正常,如果正常會返回ping完成。
3 放入的消息沒有到QM2的隊列中
注意:消息一定要放入遠程隊列中,如果放入傳輸隊列中消息會被放入死信隊列中。(上面忘記定義死信隊列了,暈)
再有看看遠程隊列中的屬性是不是配置錯誤,如rname,rqname,xmitq等屬性。
也有可能是發送接收隊列的消息序列號不一致。如果不一致做一下reset操作。
還有可能是上一批消息沒有提交。可以做一個resolve操作。
也是要先看錯誤日志
4 消息到達QM2隊列QL2中,但是取不出來
QL2的允許取出屬性是不是被禁止了。
這樣再查看以下QM2到QM1的傳輸是不是正常。都正常就OK了。
一、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
四、PCF
PCF,全稱為Programmable Command Formats,可編程的命令格式。
WebSphere MQ PCF用於MQ的系統管理編程,應用程序使用PCF實現MQSC的功能,使得MQ管理任務可編寫到應用程序中,PCF 命令和MQSC 命令具有相同的命令集;例如,PCF使得可以在程序中創建隊列和進程定義和更改隊列管理器。
下面的Java代碼描述MQ客戶機端程序通過PCF更改遠程服務器上所以的隊列的名稱,並打印到控制台的過程。
Java代碼 收藏代碼
public static void main (String [] args){
PCFMessageAgent agent;
PCFMessage request;
PCFMessage [] responses;
String [] names;
agent = new PCFMessageAgent ("192.168.222.132",1414,"JAVA.CHANNEL");
System.out.println ("Connected.");
// Build the PCF request
request = new PCFMessage (CMQCFC.MQCMD_INQUIRE_Q_NAMES);
request.addParameter (CMQC.MQCA_Q_NAME, "*");
request.addParameter (CMQC.MQIA_Q_TYPE, CMQC.MQQT_ALL);
System.out.print ("Sending PCF request... ");
// Use the agent to send the request
responses = agent.send (request);
System.out.println ("Received reply.");
// Extract the MQCACF_Q_NAMES parameter from the response
names = (String []) responses [0].getParameterValue (CMQCFC.MQCACF_Q_NAMES);
// Display the results
System.out.println ("Queue names:");
for (int i = 0; i < names.length; i++)
{
System.out.println ("\t" + names [i]);
}
// Disconnect the agent
System.out.print ("Disconnecting... ");
agent.disconnect ();
System.out.println ("Done.");
}
MQAI,全稱為MQ Administration Interface,MQ管理接口
MQAI:除了PCF的系統管理編程接口之外,WebSphere MQ還提供另外一種系統管理編程接口,即:MQ管理接口(MQ Administration Interface,簡稱為MQAI),MQAI是MQ 提供的一種簡化的、實現發送和接收PCF命令消息和回復消息的接口,MQAI通過使用數據包(Data Bags)來處理對象的屬性,這樣比直接使用PCF更簡單。
MQAI的底層工作機制同PCF一樣,也是通過發送PCF命令消息到MQ命令服務器隊列,從而被命令服務器解釋執行,並等待回復消息來管理WebSphere MQ,如圖所示:
MQAI是PCF的易用版本。
有關PCF和MQAI的詳細信息,請參考MQ的幫助文檔和IBM工程師編寫的MQ系統管理編程概述一文
http://www.ibm.com/developerworks/cn/websphere/library/techarticles/loulijun/0402_mqsysm/mqsysm.html
五、其他命令
例如amqsput(向隊列放入消息)、amqsget(從隊列取消息)為MQ的內置樣本程序。
-----------------------------------------------------------------------------------------------------------------------------
MQ系列之二、維護MQ
一、命令是開始
維護MQ,就必須要了解MQ的作用和其相關命令。
MQ作為通信中間件,其通訊方式有兩種:MQ之間進行通訊、開發的程序和mq之間的通訊。
MQ之間進行通訊:通過發送接收通道建立tcp連接進行消息傳輸,稱為server對server
開發的程序和MQ之間的通訊:通過服務器連接通道進行傳輸,client對server。
MQ有很多有用的命令,以下是一些常用命令:
$dspmq /*列出現有隊列*/
$strmqm TEST /*啟動隊列管理器*/
$runmqsc TEST /*定義管理器資源*/
end /*退出*/
$runmqlsr -t tcp -m TEST -p 1442 /*啟動偵聽器*/
$endmqm TEST /*停止MQ服務*/
$display q(QTEST) all /*顯示隊列的所有屬性*/
$display q(QTEST) /*顯示隊列的所有屬性*/
$display q(QTEST) maxdepth curdepth /*顯示隊列的所選屬性*/
$dis qmgr all /*顯示隊列管理器的所有屬性*/
MQ有很強大的命令輸入幫助,當你對命令不熟悉或是不確定時,可以輸入部分命令來查詢;MQ還支持很多的簡寫,熟悉之后可以很大程度的提高效率。
二、故障是歷練
MQ作為通信中間件,可能涉及不止一個平台,故障也就多種多樣。無論是什么維護,學會看日志總是一個好的開始,MQ的錯誤日志存放在$mq/qmgrs/$qm_name/errors下,日志是輪流寫入的,要注意看對日志。mq的日志比較詳盡,具體怎么看我就不累述了。下面列舉幾個常見問題的恢復方法:
1、無法將消息數據放到隊列中
一般這種情況應該大部分是遠程隊列中的傳輸隊列那個參數配置的不正確,還有可能是隊列的允許放入這個參數設置成了禁止或是隊列堵塞了。
a、檢查隊列屬性的CURDEPTH達到MAXDEPTH值,如果CURDEPTH達到MAXDEPTH,表明隊列深度已經達到最大值,這樣就導致新的消息數據無法放入。
$display queue(q_name)maxdepth curdepth
b、檢查隊列屬性PUT是否為ENABLED,如果不是則說明隊列不允許放入消息,可以用下面命令修改
$alter qlocal(q_name) get (ENABLED)
c、檢查隊列屬性MAXMSGL的值(默認4M),如果准備放入消息的大小大於隊列這個值,則需要修改隊列的MAXMSGL屬性值,並將該值相應擴大。
注意:修改該屬性值時也要同時修改遠端對應的隊列的值以及對應的通道的值,否則即便是消息能放入該對列,也無法傳輸到遠端對應的隊列中。
2、發送通道和接收通道的狀態不是running
a、首先檢查網絡是否正常
我們可以執行mq中的一個命令來查看通道是不是正常
runmqsc QM1
ping chl(QM1.QM2)
ping操作來查看兩邊的通道是不是正常,如果正常會返回ping完成。
b、停止通道,然后復位兩端通道 RESET CHANNEL(channel_name) [ SEQNUM( 1 | integer) ]。復位完成后,啟動通道。
c、如果還是不行,可以執行RESOLVE CHANNEL(channel_name) ACTION (BACKOUT)進行回退,ACTION有兩個參數 BACKOUT和Commit,BACKOUT 將把可疑消息恢復到傳輸隊列,而Commit將丟棄可疑消息。通常選擇使用BACKOUT。
3、MQ異常終止產生殘留的信號燈和共享內存處理方法。
a、MQ異常停止會產生殘留的信號燈和共享內存,導致MQ無法正常啟動和開啟隊列管理器。
$dspmq
QMNAME(TEST) STATUS(Quiescing)
$strmqm TEST
WebSphere MQ queue manager 'TEST' ending.
b、可以執行$ipcs -a | grep mq列出相應的信號燈和內存
如果有,使用ipcrm命令清除:
ipcrm -s <semphore id>
ipcrm -m <shared memory id >
c、再次啟動MQ隊列管理器即可正常。
MQ隊列管理器搭建之(一)
多應用單MQ使用場景
如上圖所示,MQ獨立安裝,或者與其中一個應用同處一機。Application1與Application2要進行通信,但因為跨系統,所以引入中間件來實現需求。
Application1需要連接MQ,並將消息放入隊列Queue中,Application2同樣連接MQ,監聽在Queue隊列上,一旦發現有消息進入則取出該消息進行處理。
下面將給出創建隊列管理器和隊列的示例:
定義隊列管理器名稱為Qm1,本地隊列名稱為Queue,服務器連接通道CHAN_SERVER_CON,監聽端口為1414,死性隊列QDEAD
搭建MQ隊列可以使用圖形用戶界面也可以使用命令進行,此處使用命令進行。
1.創建MQ隊列管理器,使用mqm用戶登錄MQ所在機器
mqm@localhos ~>$crtmqm Qm1
2.啟動Qm1隊列管理器
mqm@localhos ~>$strmqm Qm1
3.進入Qm1命令行
mqm@localhos ~>$runmqsc Qm1
4.定義一個本地隊列Queue
DEFINE QLOCAL ('Queue') DEFPSIST (YES) MAXDEPTH(100) REPLACE
'Queue'為隊列名稱,至於使用單引號的原因是,如果在shell腳本中不加單引號的話,最后創建出來的會變成大寫QUEUE.。
DEFPSIST(YES)表示該隊列為持久化隊列,MAXDEPTH(100)代表該隊列的最大深度為100,如果消息超過了100的話,則會被放入死性隊列。
5.在定義一個死性隊列QDEAD
DEFINE QLOCAL ('QDEAD') DEFPSIST (YES) MAXDEPTH(100) REPLACE
6..給Qm1設置指定的死性隊列,當消息無法到達指定的Queue中時,會被放入死性隊列QDEAD
ALTER QMGR DEADQ(‘QDEAD’)
7.定義服務器連接通道CHAN_SERVER_CON,該通道的用途是供應用程序連接的,應用程序通過服務器連接通道從而連接MQ。
DEFINE CHANNEL(‘CHAN_SERVER_CON’) CHLTYPE(SVRCONN) REPLACE
8.定義監聽器LISTENER.TCP,該端口1414應用程序連接時需要指定。
DEFINE LISTENER('LISTENER.TCP') TRPTYPE(TCP) CONTROL(QMGR) PORT(1414) REPLACE
9.啟動監聽器LISTENER.TCP
START LISTENER('LISTENER.TCP')
到此為止這個需求中的MQ隊列管理器已經創建完畢了。如果在創建過程中出現錯誤,或者想停止隊列管理器,或者想刪除重新創建,則執行下述命令:
1.刪除前先停止隊列管理器
ctrl+c可以沖命令行跳出,或者輸入end回車也可以。
mqm@localhos ~>$endmqm Qm1 停止隊列管理器
mqm@localhos ~>$dspmq 查看當前隊列管理器的執行狀態,當隊列管理器狀態變為Ended normally時才能刪除
mqm@localhos ~>$dltmqm Qm1 刪除隊列管理器,它會級聯刪除該隊列管理器中的隊列和監聽器等等。
2.至於java如何與MQ通信,如何連接MQ隊列此處不做過多的闡述了!
第三章 MQ隊列管理器搭建之(二)
MQ級聯方式使用場景
使用場景:
如上圖所示,Application1與Application2要進行通信或者消息互換,使用MQ中間件作為中介。上圖中,Application1與Application2通信不進行直接連接,而是通過與MQ通信從而實現二者的通信。圖中兩個MQ的信息如上描述。其中RemoteQueue為遠程隊列,該隊列指定了目標端對應的隊列為Queue,並且該遠程隊列指定了傳輸所使用的傳輸隊列尾TransQueue;而此傳輸隊列TransQueue與發送通道CHAN_QMGR1_TO_QMGR2相關聯,並且可以在該傳輸隊列上設置觸發器。Application1連接通過CHAN_SERVER_CON服務器連接通道連接MQ,將消息放入RemoteQueue遠程隊列,MQ的遠程隊列收到放入的消息后將消息放入與之關聯的傳輸隊列,傳輸隊列中有消息后么,觸發器會產生觸發消息,通過發送通道將該條消息發送到目標端。此處需要注意的是,在發送通道中會指定目標端的ip和端口號,並且發送通道的名稱需要與目標端接收通道的名稱一致,即一個發送通道要對應目標端的一個接收通道,並且名稱相同。如此消息便發到了MQ2的接收通道中,MQ2拿到消息后,該消息描述了它的目標點是Queue隊列,則MQ2會將消息放入MQ2的Queue本地隊列中去。
MQ級聯方式的搭建,左邊的MQ隊列管理器名稱叫做MQ1,右邊的叫做MQ2:
MQ1的搭建:
1.創建隊列管理器MQ1。(使用mqm用戶連接MQ所在的機器,dspmq查看隊列的狀態,查看MQ1是否已經創建,如果已經創建則更換名稱,或者刪掉重建)
mqm@localhos ~>$crtmqm MQ1
2.啟動隊列管理器
mqm@localhos ~>$strmqmMQ1
3.進入MQ1的命令行模式
mqm@localhos ~>$runmqsc MQ1
4.定義本地隊列Queue,下面的含義不再贅述參見本章的上一節。
DEFINE QLOCAL ('Queue') DEFPSIST (YES) MAXDEPTH(100) REPLACE
5.定義一個遠程隊列 RemoteQueue
DEFINE QREMOTE('RemoteQueue') RNAME('Queue') RQMNAME('MQ2') XMITQ('TransQueue')
RNAME('Queue') 指定了對應的目標端的隊列是Queue,RQMNAME('MQ2')指定了目標端的隊列管理器名稱為MQ2, XMITQ('TransQueue')指定了該遠程隊列關聯的傳輸隊列為‘TransQueue’。
6.定義一個傳輸隊列TransQueue
DEFINE QLOCAL('TransQueue') usage(XMITQ) DEFPSIST(YES) INITQ(SYSTEM.CHANNEL.INITQ) TRIGDATA('CHAN_QMGR1_TO_QMGR2') TRIGTYPE(FIRST) TRIGGER REPLACE
與本地隊列不同的是 usage(XMITQ) ,它指定了該隊列為傳輸隊列。DEFPSIST(YES)代表隊列持久化, INITQ(SYSTEM.CHANNEL.INITQ) TRIGDATA('CHAN_QMGR1_TO_QMGR2') TRIGTYPE(FIRST) TRIGGER 與設置觸發器相關,初始化隊列為SYSTEM.CHANNEL.INITQ,被觸發的通道為'CHAN_QMGR1_TO_QMGR2',觸發方式為First,每個消息到達時產生觸發事件。
7.定義一個發送通道CHAN_QMGR1_TO_QMGR2
DEFINE CHANNEL('CHAN_QMGR1_TO_QMGR2') CHLTYPE(SDR) CONNAME('192.168.xx.xx(1414)') XMITQ('TransQueue')
CONNAME指定了目標端ip和端口號,CHLTYPE(SDR)指定了通道的類型為發送,XMITQ指定了傳輸隊列的名稱。
8.定義一個接收通道CHAN_QMGR2_TO_QMGR1,該名稱與發送端的發送通道名稱一致。
DEFINE CHANNEL(CHAN_QMGR2_TO_QMGR1) CHLTYPE(RCVR)
9.定義一個服務器連接通道
DEFINE CHANNEL(CHAN_SERVER_CON) CHLTYPE(SVRCONN) REPLACE
10.在定義一個死性隊列QDEAD
DEFINE QLOCAL ('QDEAD') DEFPSIST (YES) MAXDEPTH(100) REPLACE
11.給MQ1設置指定的死性隊列,當消息無法到達指定的Queue中時,會被放入死性隊列QDEAD
ALTER QMGR DEADQ(‘QDEAD’)
12.定義監聽器LISTENER.TCP,該端口1414應用程序連接時需要指定。
DEFINE LISTENER('LISTENER.TCP') TRPTYPE(TCP) CONTROL(QMGR) PORT(4141) REPLACE
13.啟動監聽器LISTENER.TCP
START LISTENER('LISTENER.TCP')
如此發送的一方就搭建完了。
MQ2的搭建:
1.創建隊列管理器MQ2。(使用mqm用戶連接MQ所在的機器,dspmq查看隊列的狀態,查看MQ2是否已經創建,如果已經創建則更換名稱,或者刪掉重建)
mqm@localhos ~>$crtmqm MQ2
2.啟動隊列管理器
mqm@localhos ~>$strmqm MQ2
3.進入MQ2的命令行模式
mqm@localhos ~>$runmqsc MQ2
4.定義本地隊列Queue,下面的含義不再贅述參見本章的上一節。
DEFINE QLOCAL ('Queue') DEFPSIST (YES) MAXDEPTH(100) REPLACE
5.定義一個遠程隊列RemoteQueue
DEFINE QREMOTE('RemoteQueue') RNAME('Queue') RQMNAME('MQ1') XMITQ('TransQueue')
RNAME('Queue') 指定了對應的目標端的隊列是Queue,RQMNAME('MQ1')指定了目標端的隊列管理器名稱為MQ1, XMITQ('TransQueue')指定了該遠程隊列關聯的傳輸隊列為‘TransQueue’。
6.定義一個傳輸隊列TransQueue
DEFINE QLOCAL('TransQueue') usage(XMITQ) DEFPSIST(YES) INITQ(SYSTEM.CHANNEL.INITQ) TRIGDATA('CHAN_QMGR2_TO_QMGR1') TRIGTYPE(FIRST) TRIGGER REPLACE
與本地隊列不同的是 usage(XMITQ) ,它指定了該隊列為傳輸隊列。DEFPSIST(YES)代表隊列持久化, INITQ(SYSTEM.CHANNEL.INITQ) TRIGDATA('CHAN_QMGR2_TO_QMGR1') TRIGTYPE(FIRST) TRIGGER 與設置觸發器相關,初始化隊列為SYSTEM.CHANNEL.INITQ,被觸發的通道為'CHAN_QMGR2_TO_QMGR1',觸發方式為First,每個消息到達時產生觸發事件。
7.定義一個發送通道CHAN_QMGR2_TO_QMGR1
DEFINE CHANNEL('CHAN_QMGR2_TO_QMGR1') CHLTYPE(SDR) CONNAME('192.168.xx.xx(4141)') XMITQ('TransQueue')
CONNAME指定了目標端ip和端口號,CHLTYPE(SDR)指定了通道的類型為發送,XMITQ指定了傳輸隊列的名稱。
8.定義一個接收通道CHAN_QMGR1_TO_QMGR2,該名稱與發送端的發送通道名稱一致。
DEFINE CHANNEL(CHAN_QMGR1_TO_QMGR2) CHLTYPE(RCVR)
9.定義一個服務器連接通道
DEFINE CHANNEL(CHAN_SERVER_CON) CHLTYPE(SVRCONN) REPLACE
10.在定義一個死性隊列QDEAD
DEFINE QLOCAL ('QDEAD') DEFPSIST (YES) MAXDEPTH(100) REPLACE
11.給MQ1設置指定的死性隊列,當消息無法到達指定的Queue中時,會被放入死性隊列QDEAD
ALTER QMGR DEADQ(‘QDEAD’)
12.定義監聽器LISTENER.TCP,該端口1414應用程序連接時需要指定。
DEFINE LISTENER('LISTENER.TCP') TRPTYPE(TCP) CONTROL(QMGR) PORT(1414) REPLACE
13.啟動監聽器LISTENER.TCP
START LISTENER('LISTENER.TCP')
這樣就完成了MQ1與MQ2的互相通信了,需要注意的是,此處兩個隊列管理器的監聽端口不能一樣。
小結:此種連接方式適用於小批量消息的發送及接收,即單個隊列管理器便能滿足需求。此外這種方式是將隊列管理器與遠程隊列進行了綁定,不便於擴展。
下一節內容中將會提到MQ集群的搭建,以及網關隊列管理器的搭建。
第三章 MQ隊列管理器搭建之(三)
MQ集群及網關隊列管理器的搭建
描述:
如上圖所示,為MQ的集群搭建部署圖。CLUSTERA、CLUSTERB分別是兩個集群,其中Qm1-Qm3、GateWayA為CLUSTERA集群中的隊列管理器;Qm1-Qm3、GateWayB是CLUSTERB集群中的隊列管理器。GateWayA與GateWayB負責網絡路由和消息分發,使用集群的方式可以達到負載均衡的目的,除此之外還能提高MQ使用的穩定性。同一個集群中除網關隊列管理器外的任意隊列管理器因故關閉或停止工作后,其他的隊列管理器可以接管它的工作從而保證業務應用的正常運行。
使用場景:
為了提高分布式應用異步消息傳輸及處理的效率,從中間件的角度來優化,除此之外要保證消息傳輸過程的可靠性。Application1通過網關隊列管理器A將消息發送到網關隊列管理器GateWayB中,GateWayB收到消息后根據自身負載均衡算法將消息分發到不同的隊列管理器對應的隊列中,Application2使用監聽的方式監聽於Qm1-Qm3的隊列上,一旦有消息被分發到各自的隊列時,應用程序則會獲取消息進行處理。
集群及網關隊列管理器的搭建:(左邊的未A機器、右邊的為B機器)
Qm1、Qm2、Qm3、GateWayA、GateWayB為隊列管理。
Queue為本地隊列,分別在A中的Qm1、Qm2、Qm3和B中的Qm1、Qm2、Qm3創建。
TransQueue為傳輸隊列,分別在GateWayA和GateWayB中創建。
CHAN_GATEWAYA_TO_GATEWAYB、CHAN_GATEWAYB_TO_GATEWAYA為發送、接收通道,在GateWayA中創建。
CHAN_GATEWAYB_TO_GATEWAYA、CHAN_GATEWAYA_TO_GATEWAYB為發送、接收通道,在GateWayB中創建。
ANY.TO.CLUSTERB為遠程隊列,在GateWayA中創建。
ANY.TO.CLUSTERA為遠程隊列,在GateWayB中創建。
RemoteQueue為遠程隊列,分別在GateWayA、GateWayB中創建。
CLUSTERA、CLUSTERB分別為A、B機器的MQ集群名稱。
QEDAD分別在A、B機器的所有隊列管理器中創建。
1.分別在A、B機器上創建隊列管理器Qm1、Qm2、Qm3。
--參見《第三章 MQ隊列管理器搭建之(二)》
2.創建網關隊列管理器GateWayA、GateWayB。
--網關隊列管理器的創建與Qm1-Qm3方式相同,不同的是網關隊列管理器中需要創建一個特殊的遠程隊列,此外其他的遠程隊列指向的目標隊列管理器名稱為目標網關隊列管理器中的遠程隊列名。
GateWayA中
--DEFINE QREMOTE('RemoteQueue') RNAME('Queue') RQMNAME('ANY.TO.CLUSTERB') XMITQ('TransQueue')
--DEFINE QREMOTE(ANY.TO.CLUSTERA) RNAME('') RQMNAME('')
GateWayB中
--DEFINE QREMOTE('RemoteQueue') RNAME('Queue') RQMNAME('ANY.TO.CLUSTERA') XMITQ('TransQueue')
--DEFINE QREMOTE(ANY.TO.CLUSTERB) RNAME('') RQMNAME('')
3創建Queue、RemoteQueueCHAN_GATEWAYA_TO_GATEWAYB、CHAN_GATEWAYB_TO_GATEWAYA及監聽端口。
--參見《第三章 MQ隊列管理器搭建之(二)》
4.創建本地隊列Queue,創建中需要指定集群名稱。
A機器的Qm1-Qm3
--DEFINE QLOCAL ('Queue') CLUSTER(CLUSTERA) DEFPSIST (YES) MAXDEPTH(100) REPLACE
B機器的Qm1-Qm3
--DEFINE QLOCAL ('Queue') CLUSTER(CLUSTERB) DEFPSIST (YES) MAXDEPTH(100) REPLACE
5.定義完全存儲倉庫(Qm1與Qm3為完全存儲倉庫、網關隊列管理器和Qm2為部分存儲倉庫)
--runmqsc Qm1
--ALTER QMGR REPOS(CLUSTERA)
--runmqsc Qm3
--ALTER QMGR REPOS(CLUSTERA)
6.定義集群發送通道與集群接收通道
A:
GateWayA:
--DEFINE CHANNEL(TO.GateWayA) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) CONNAME('192.168.x.x(1414)') CLUSTER (CLUSTERA)
--DEFINE CHANNEL(TO.Qm1) CHLTYPE(CLUSSDR) TRPTYPE(TCP) CONNAME('192.168.x.x(2414)') CLUSTER (CLUSTERA)
Qm1:
--DEFINE CHANNEL(TO.Qm1) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) CONNAME('192.168.x.x(2414)') CLUSTER (CLUSTERA)
--DEFINE CHANNEL(TO.Qm3) CHLTYPE(CLUSSDR) TRPTYPE(TCP) CONNAME('192.168.x.x(4414)') CLUSTER (CLUSTERA)
Qm2:
--DEFINE CHANNEL(TO.Qm2) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) CONNAME('192.168.x.x(3414)') CLUSTER (CLUSTERA)
--DEFINE CHANNEL(TO.Qm1) CHLTYPE(CLUSSDR) TRPTYPE(TCP) CONNAME('192.168.x.x(2414)') CLUSTER (CLUSTERA)
Qm3:
--DEFINE CHANNEL(TO.Qm3) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) CONNAME('192.168.x.x(4414)') CLUSTER (CLUSTERA)
--DEFINE CHANNEL(TO.Qm1) CHLTYPE(CLUSSDR) TRPTYPE(TCP) CONNAME('192.168.x.x(2414)') CLUSTER (CLUSTERA)
B:參見A類似
CCSID
MQCCSID
值為隊列管理器的CCSID或與之相匹配的CCSID。
例如Windows上的隊列管理器的CCSID為1381,AIX上可設為1386或1208
export MQCCSID=1208
export MQCCSID=1386
--------------------------------------
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)作為兩種語言集的中介。
MQCCSID 到底是什么,在干什么
首先,安裝好了MQ Server端並新建了QMGR,可以更改其MQCCSID, 我們環境中所有QMGR的MQCCSID都是1386
再次,在MQ Server上面任何用戶在往該MQGR的queue里面放消息時,消息使用的字符編碼都是1386與QMGR的設定相同,這里即使在用戶的profile里面export MQCCSID等於別的,結果消息也是始終與QMGR的設定保持一樣。
最后,export MQCCSID只有在MQ Client端才有用,通過export MQSERVER 連接到MQ Server的MQ Client端可以給用戶的profile里面設定MQCCSID, 我們這邊的環境AIX 上面如果沒有給用戶特別設定MQCCSID則default的是819即en_US.ISO8859-1
ccsid 英文意思是雙字節字符集標識,是IBM的企業標准。中國漢字有多種漢字字符集標准,最常用的有兩種。ccsid與中國國標漢字字符集編碼不一樣。ccsid是IBM把世界范圍的需用兩個字節表示的文字代碼,根據國家區域,設置為不同的ccsid標識。所以在建立db2/400文件都要對應一個ccsid,以便數據字段能夠存放這個ccsid中的字符。通常這個ccsid是采用系統默認值,也可以特殊設置某個pf的ccsid。因為400ccsid是基於ebcdic碼編寫的,而目前unix和pc機是基於acsii碼編寫的,這兩者的相同國家的字符代碼存在差異,所以在進行基於不同代碼基礎的計算機進行通訊,就要進行代碼集的字符轉換。通常我們常用到ftp進行400與pc機,或400與UNIX平台的數據傳輸。
如果進行上述數據傳輸,通訊端必須設置pc端,或unix端和400端的交換字符集。幸運的是,ibm的通訊線路已經設置好ebcdic與ascii的自動轉入和轉出,我們只要選擇設置ccsid的具體代碼就可以了。
Borlan公司也有一套自己的類似ibm的ccsid,在使用基於Borlan數據和編程軟件時也要設置這些‘ccsid’,否則通訊就有問題。
順便說一下,我曾經遇到使用國內一家金融服務的加密軟件公司的產品,他們就是利用ibm ccsid與Borland的字符集的設置差異,達到其這類加密產品固定在一定環境下才能使用的目的。
為了幫助網友解決“MQ中如何查看CCSID是多少?”相關的問題,中國學網通過互聯網對“MQ中如何查看CCSID是多少?”相關的解決方案進行了整理,用戶詳細問題包括:默認1381就不用說了 我想知道在哪看 如果要改 怎么改?,具體解決方案如下:
解決方案1:
runmqsc MQ名
dis QMGR
顯示全信息 其中就有CCSID
解決方案2:
進入console
運行
ALTER QMGR CCSID(你要改成多少?)
如“1381”
解決方案3:
runmqsc queue_name
ALTER QMGR CCSID("xxxxx")