IBM MQ

Message channels

The purpose of a message channel is to transfer messages from one queue manager to another. Message channels are not required by the client server environment.

Figure 1. Message channels between two queue managers
Queue manager on System A, connected to queue manager on System B, using two message channels, one in each direction.

A message channel is a one-way link. If you want a remote queue manager to respond to messages sent by a local queue manager, you must set up a second channel to send responses back to the local queue manager.

 

MQI channels

A Message Queue Interface (MQI) channel connects an IBM MQ MQI client to a queue manager on a server machine, and is established when you issue an MQCONN or MQCONNX call from an IBM MQ MQI client application.

It is a two-way link and is used for the transfer of MQI calls and responses only, including MQPUT calls that contain message data and MQGET calls that result in the return of message data. There are different ways of creating and using the channel definitions (see Defining MQI channels ).

Figure 2. Client-connection and server-connection on an MQI channel
A client connected to a queue manager using an MQI channel. The channel has a client-connection on the client and a server-connection on the server.
 

Sender--Receiver:用於一對一的通信,發送方服務器必須指定接收服務器的地址,而接收服務器配置很是簡單,只須要一個【接收方通道】就好了,能夠接收不少發送服務器發來的消息,至關於多對一。

發送服務器配置【發送方通道】並指明接收服務器的IP

接受服務器配置【接收方通道】,所有默認,兩個通道的名稱必須一致

 

Server-Receiver:效果與Sender--Receiver如出一轍,進行一對一的通信。

發送服務器配置【服務器通道】並指明接收服務器的IP

接受服務器配置【接收方通道】,所有默認,兩個通道的名稱必須一致

 

Server-Requester:用於實現一對多的通信

發送服務器配置【服務器通道】,不指明IP

接受服務器配置【請求方通道】,指明發送服務器的IP,兩個通道的名稱必須一致

 

Sender-Requester:用於實現嚴格的一對一通信

發送服務器配置【服務器通道】,並指明接收服務器的IP

接受服務器配置【請求方通道】,指明發送服務器的IP,兩個通道的名稱必須一致

 

MQ的核心API

一、MQQueueManager―――隊列管理器訪問類 

 

經常使用方法: 
public MQQueueManager(String queueManagerName)―――創建一個管理器實例 

建立隊列管理器有兩種方式:

1:綁定方式,這種方式要求MQ服務器與應用程序同屬一臺服務器,效率比較高。

2:客戶機方式:這種方式應用程序和MQ服務器能夠不在同一臺服務器上,可是要考慮到MQ權限的問題,尤爲是MQ7.5以後,權限變的很複雜,慎重對待。
注:若是使用綁定的方式則能夠直接建立一個新的隊列管理器實例。可是在某些平臺下這樣直接建立會出錯,必須採用MQClient的方式進行鏈接。此時須要先定義服務通道,端口,服務名等環境變量,再建立一個隊列管理器實例。如:

 

[html]  view plain  copy
 
  1. MQEnvironment.hostname = "IP地址";  
  2. MQEnvironment.channel = "channelname";  
  3. MQEnvironment.port = port ;  
  4. MQEnvironment.CCSID = CCSID;  
  5. MQQueueManager qMgr = new MQQueueManager(hostname);  

其中hostname表示隊列管理器所在的機器地址(通常在本地則填localhost或127.0.0.1)。

port就是隊列管理器的偵聽端口。

Channel定義訪問的服務器通道名(須要本身在隊列管理器中先定義,其方法相似與通常通道的定義,不過類型是服務器通道)

public bool isConnected()―――返回隊列管理器是否在鏈接狀態 

public synchronized void disconnect()―――斷開隊列管理器的鏈接  

 

二、MQQueue―――隊列訪問類 

經常使用方法:
一般MQQueue實例的生成經過調用MQQueueManager的accessQueue方法類實例化。 

 

public synchornized MQQueue accessQueue(String QueueName,int openOptions)―――返回一個鏈接隊列的實例(類名爲:MQQueue) 

 

經常使用方法: 
public synchronized void get(MQMessage message,MQGetMessageOptions gmo)―――從隊列管理器讀取一條

消息經過message實例返回。MQGetMessageOptions的用法下面再詳述。

 public synchronized void put(MQMessage message,MQPutMessageOptions pmo)―――往隊列管理器放入一條

消息 MQPutMessageOptions的用法下面再詳述 

public synchronized void close()―――關閉隊列的鏈接 

 

3.openOptions---隊列的打開方式

 

經常使用值有: 
MQC.MQOO_FAIL_IF_QUIESCING―――若是隊列管理器中止則返回失敗 

MQC.MQOO_OUTPUT――――以寫方式打開隊列 
MQC.MQOO_INPUT_AS_Q_DEF―――以隊列默認讀取方式打開隊列 使用的時候能夠採用與操做來實現多種打開隊列方式,

MQC.MQOO_BROWSE;――――以瀏覽方式打開隊列

MQC.MQGMO_BROWSE_NEXT; ――――瀏覽下一個消息

如: 
int openOptions = MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_AS_Q_DEF; 表示以讀、寫方式打開隊列  

 

4.MQMessage―――消息操做類 經常使用方法: 

public MQMessage()―――默認構造函數 
public int getDataLength()―――返回可讀取的消息的長度(以byte做爲單位) 
public void readFully(byte b[])―――讀取消息到數組b中,長度以b的數組長度爲準 

屬性:

format = MQC.MQFMT_STRING;

msg.characterSet = ccsid;//字符集
msg.encoding = ccsid;//寫的字符集


通常讀取消息的操做爲: 

[html]  view plain  copy
 
  1. MQMessage message = new MQMessage(); ….   
  2. int length = message.getDataLength();   
  3. byte buffer[] = new byte[length];   
  4. message.readFully(buffer);   

 

public void write(byte b[])―――把指定的字節數組寫入消息 
通常寫消息的操做爲: 

 

[html]  view plain  copy
 
  1. byte[] buffer = 「asdasdad」.getBytes();   
  2. MQMessage message = new MQMessage(); ….   
  3. message.write(buffer);   
  4. queue.put(message….   

 

5.MQGetMessageOptions―――取消息操做選項

 經常使用方法: 
public MQGetMessageOptions()―――默認構造函數 

public int options―――操做選項(位操做) 
public int matchOptions―――條件選項(按照某種條件獲取消息) 
public int waitInterval―――等待時長(單位:毫秒)僅當options選項有MQC.MQGMO_WAIT纔有效  

6.MQPutMessageOptions―――放消息操做選項 

 

經常使用方法: 
public MQPutMessageOptions()―――默認構造函數 

public int options―――操做選項(位操做)   

7.MQ自帶鏈接池

MQ隊列管理器有本身的鏈接池,可使用鏈接池得到鏈接

咱們可使用的MQ本身的默認鏈接池

MQPoolToken token=MQEnvironment.addConnectionPoolToken();

這樣就會把在本線程中對隊列管理器的鏈接歸入到了MQ自帶的線程管理機制中(qm.disconnect()實際上就是將qm的鏈接從新放回池中 qm= new MQQueueManager()會去池裏找一個可用的鏈接賦給qm)

由於隊列管理器是選擇了偵聽端口,可使用netstat -an |grep 9004 看到鏈接到這個隊列管理器上鍊接.

 
一.MQ基本操做
MQ中有幾個很重要的組件:隊列管理器(QueueManager)、隊列(Queue)和通道(Channel)。其基本的操做方法以下:
建立隊列管理器 
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)
相關文章
相關標籤/搜索