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)