IBM MQ
- https://www.ibm.com/support/knowledgecenter/SSFKSJ_9.1.0/com.ibm.mq.pro.doc/q003080_.htm
- 当应用程序打开队列时,应用程序所连接的队列管理器将确定该队列是队列管理器所拥有的本地 队列,还是由另一个队列管理器所拥有的远程 队列。对于本地队列,直接将消息放入到该队列。如果队列是远程的,那么队列管理器将消息放到一个称为传输 队列的特殊队列。
- 然后,消息通道代理 (MCA) 从传输队列中获取消息,并将其通过网络发送到接收端的 MCA。接收 MCA 将该消息放到目标 队列。在将消息放到目标队列中之后,便将其从传输队列中删除。消息流在队列管理器之间可以是双向的。
- 如果接收 MCA 不能将该消息放到目标队列中,那么将根据消息描述符中的选项对其进行处理。可能将其放到死信 队列,也可能将其返回给发送者,甚至将其丢弃。
- MCA 可以使用各种网络和通信协议与其他的 MCA 相互通信,并且甚至可以在一段时间之后更改所使用的协议。但是,应用程序开发人员仅需要了解与队列管理器通信所需的 MQI 调用。
-
MQ的通讯模式
1) 点对点通讯:点对点方式是最为传统和常见的通讯方式,它支持一对一、一对多、多对多、多对一等多种配置方式,支持树状、网状等多种拓扑结构。
2) 多点广播:MQ适用于不同类型的应用。其中重要的,也是正在发展中的是"多点广播"应用,即能够将消息发送到多个目标站点(Destination List)。可以使用一条MQ指令将单一消息发送到多个目标站点,并确保为每一站点可靠地提供信息。MQ不仅提供了多点广播的功能,而且还拥有智能消息分发功能,在将一条消息发送到同一系统上的多个用户时,MQ将消息的一个复制版本和该系统上接收者的名单发送到目标MQ系统。目标MQ系统在本地复制这些消息,并将它们发送到名单上的队列,从而尽可能减少网络的传输量。
3) 发布/订阅(Publish/Subscribe)模式:发布/订阅功能使消息的分发可以突破目的队列地理指向的限制,使消息按照特定的主题甚至内容进行分发,用户或应用程序可以根据主题或内容接收到所需要的消息。发布/订阅功能使得发送者和接收者之间的耦合关系变得更为松散,发送者不必关心接收者的目的地址,而接收者也不必关心消息的发送地址,而只是根据消息的主题进行消息的收发。在MQ家族产品中,MQ Event Broker是专门用于使用发布/订阅技术进行数据通讯的产品,它支持基于队列和直接基于TCP/IP两种方式的发布和订阅。
4) 群集(Cluster):为了简化点对点通讯模式中的系统配置,MQ提供Cluster(群集)的解决方案。群集类似于一个域(Domain),群集内部的队列管理器之间通讯时,不需要两两之间建立消息通道,而是采用群集(Cluster)通道与其它成员通讯,从而大大简化了系统配置。此外,群集中的队列管理器之间能够自动进行负载均衡,当某一队列管理器出现故障时,其它队列管理器可以接管它的工作,从而大大提高系统的高可靠性
-
Pub/Sub发布订阅(广播):使用topic作为通信载体
PTP点对点:使用queue作为通信载体
- Queues
Introduction to IBM MQ queues and queue attributes.
- IBM MQ queue managers
An introduction to queue managers and the queuing services that they provide to applications.
- Process definitions
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.
- Namelists
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.
- Authentication information objects
An authentication information object provides the definitions required to perform certificate revocation checking.
- Communication information objects
IBM MQ Multicast offers low latency, high fanout, reliable multicast messaging. A communication information (COMMINFO) object is needed to use Multicast transmission.
- Channels
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.
- Communications
IBM MQ MQI clients use MQI channels to communicate with the server.
- Client connection channels
Client connection channels are objects that provide a communication path from an IBM MQ MQI client to a queue manager.
- Storage classes
A storage class maps one or more queues to a page set.
- Listeners
Listeners are processes that accept network requests from other queue managers, or client applications, and start associated channels.
- Services
Service objects are a way of defining programs to be run when a queue manager starts or stops.
- Topic objects
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.
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 ).
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的方式进行连接。此时需要先定义服务通道,端口,服务名等环境变量,再创建一个队列管理器实例。如:
- MQEnvironment.hostname = "IP地址";
- MQEnvironment.channel = "channelname";
- MQEnvironment.port = port ;
- MQEnvironment.CCSID = CCSID;
- 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;//写的字符集
一般读取消息的操作为:
- MQMessage message = new MQMessage(); ….
- int length = message.getDataLength();
- byte buffer[] = new byte[length];
- message.readFully(buffer);
public void write(byte b[])―――把指定的字节数组写入消息
一般写消息的操作为:
- byte[] buffer = “asdasdad”.getBytes();
- MQMessage message = new MQMessage(); ….
- message.write(buffer);
- 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)