Dev_Eric

新浪微博:卖螃蟹的程序员

导航

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

1、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()―――断开队列管理器的连接  

 

2、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)

posted on 2018-08-17 17:40  Dev_Eric  阅读(680)  评论(0编辑  收藏  举报