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)
相关文章
相关标签/搜索