1) 點對點通信:點對點方式是最爲傳統和常見的通信方式,它支持一對1、一對多、多對多、多對一等多種配置方式,支持樹狀、網狀等多種拓撲結構。html
2) 多點廣播:MQ適用於不一樣類型的應用。其中重要的,也是正在發展中的是"多點廣播"應用,即可以將消息發送到多個目標站點(Destination List)。可使用一條MQ指令將單一消息發送到多個目標站點,並確保爲每一站點可靠地提供信息。MQ不只提供了多點廣播的功能,並且還擁有智能消息分發功能,在將一條消息發送到同一系統上的多個用戶時,MQ將消息的一個複製版本和該系統上接收者的名單發送到目標MQ系統。目標MQ系統在本地複製這些消息,並將它們發送到名單上的隊列,從而儘量減小網絡的傳輸量。api
3) 發佈/訂閱(Publish/Subscribe)模式:發佈/訂閱功能使消息的分發能夠突破目的隊列地理指向的限制,使消息按照特定的主題甚至內容進行分發,用戶或應用程序能夠根據主題或內容接收到所須要的消息。發佈/訂閱功能使得發送者和接收者之間的耦合關係變得更爲鬆散,發送者沒必要關心接收者的目的地址,而接收者也沒必要關心消息的發送地址,而只是根據消息的主題進行消息的收發。在MQ家族產品中,MQ Event Broker是專門用於使用發佈/訂閱技術進行數據通信的產品,它支持基於隊列和直接基於TCP/IP兩種方式的發佈和訂閱。數組
4) 羣集(Cluster):爲了簡化點對點通信模式中的系統配置,MQ提供Cluster(羣集)的解決方案。羣集相似於一個域(Domain),羣集內部的隊列管理器之間通信時,不須要兩兩之間創建消息通道,而是採用羣集(Cluster)通道與其它成員通信,從而大大簡化了系統配置。此外,羣集中的隊列管理器之間可以自動進行負載均衡,當某一隊列管理器出現故障時,其它隊列管理器能夠接管它的工做,從而大大提升系統的高可靠性服務器
Pub/Sub發佈訂閱(廣播):使用topic做爲通訊載體網絡
PTP點對點:使用queue做爲通訊載體app
Introduction to IBM MQ queues and queue attributes.負載均衡
An introduction to queue managers and the queuing services that they provide to applications.ide
Process definition objects allow applications to be started without the need for operator intervention by defining the attributes of the application for use by the queue manager.函數
A namelist is an IBM MQ object that contains a list of cluster names, queue names or authentication information object names. In a cluster, it can be used to identify a list of clusters for which the queue manager holds the repositories.ui
An authentication information object provides the definitions required to perform certificate revocation checking.
IBM MQ Multicast offers low latency, high fanout, reliable multicast messaging. A communication information (COMMINFO) object is needed to use Multicast transmission.
A channel is a logical communication link, used by distributed queue managers, between an IBM MQ MQI client and an IBM MQ server, or between two IBM MQ servers.
IBM MQ MQI clients use MQI channels to communicate with the server.
Client connection channels are objects that provide a communication path from an IBM MQ MQI client to a queue manager.
A storage class maps one or more queues to a page set.
Listeners are processes that accept network requests from other queue managers, or client applications, and start associated channels.
Service objects are a way of defining programs to be run when a queue manager starts or stops.
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.
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.
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 ).
Sender--Receiver:用於一對一的通信,發送方服務器必須指定接收服務器的地址,而接收服務器配置很是簡單,只須要一個【接收方通道】就好了,能夠接收不少發送服務器發來的消息,至關於多對一。
發送服務器配置【發送方通道】並指明接收服務器的IP
接受服務器配置【接收方通道】,所有默認,兩個通道的名稱必須一致
Server-Receiver:效果與Sender--Receiver如出一轍,進行一對一的通信。
發送服務器配置【服務器通道】並指明接收服務器的IP
接受服務器配置【接收方通道】,所有默認,兩個通道的名稱必須一致
Server-Requester:用於實現一對多的通信
發送服務器配置【服務器通道】,不指明IP
接受服務器配置【請求方通道】,指明發送服務器的IP,兩個通道的名稱必須一致
Sender-Requester:用於實現嚴格的一對一通信
發送服務器配置【服務器通道】,並指明接收服務器的IP
接受服務器配置【請求方通道】,指明發送服務器的IP,兩個通道的名稱必須一致
經常使用方法:
public MQQueueManager(String queueManagerName)―――創建一個管理器實例
建立隊列管理器有兩種方式:
1:綁定方式,這種方式要求MQ服務器與應用程序同屬一臺服務器,效率比較高。
2:客戶機方式:這種方式應用程序和MQ服務器能夠不在同一臺服務器上,可是要考慮到MQ權限的問題,尤爲是MQ7.5以後,權限變的很複雜,慎重對待。
注:若是使用綁定的方式則能夠直接建立一個新的隊列管理器實例。可是在某些平臺下這樣直接建立會出錯,必須採用MQClient的方式進行鏈接。此時須要先定義服務通道,端口,服務名等環境變量,再建立一個隊列管理器實例。如:
其中hostname表示隊列管理器所在的機器地址(通常在本地則填localhost或127.0.0.1)。
port就是隊列管理器的偵聽端口。
Channel定義訪問的服務器通道名(須要本身在隊列管理器中先定義,其方法相似與通常通道的定義,不過類型是服務器通道)
public bool isConnected()―――返回隊列管理器是否在鏈接狀態
public synchronized void disconnect()―――斷開隊列管理器的鏈接
經常使用方法:
一般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()―――關閉隊列的鏈接
經常使用值有:
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; 表示以讀、寫方式打開隊列
public MQMessage()―――默認構造函數
public int getDataLength()―――返回可讀取的消息的長度(以byte做爲單位)
public void readFully(byte b[])―――讀取消息到數組b中,長度以b的數組長度爲準
屬性:
format = MQC.MQFMT_STRING;
msg.characterSet = ccsid;//字符集
msg.encoding = ccsid;//寫的字符集
通常讀取消息的操做爲:
public void write(byte b[])―――把指定的字節數組寫入消息
通常寫消息的操做爲:
經常使用方法:
public MQGetMessageOptions()―――默認構造函數
public int options―――操做選項(位操做)
public int matchOptions―――條件選項(按照某種條件獲取消息)
public int waitInterval―――等待時長(單位:毫秒)僅當options選項有MQC.MQGMO_WAIT纔有效
經常使用方法:
public MQPutMessageOptions()―――默認構造函數
public int options―――操做選項(位操做)
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)