MQSreies学习笔记。
MQSreies基本由一个消息传输系统和一个应用程序接口组成,其资源是消息和队列(Messaging and Queuing)。
消息传输系统:用于确保队列之间的信息提供,包括网络中不同系统上的远程队列之间的信息提供。并保证网络故障或关闭后的恢复。
应用程序接口:用用程序和信息系统之间通过MQSeriesAPI实现的接口MQSeriesAPI在所有MQSeries平台上是一致的。API只有11个调用,2个关键动词:发送(PUT)和接受(GET)。
几个值得注意的特点:
1###应用程序可以在不同时刻运行
程序不在网络上直接通信,而是间接地将消息放入消息队列。因为程序没有直接的联系,所以他们不必同时运行。消息的到达并不影响程序的运行,如果需要,程序可以在三小时甚至三星期后才取消息。
2###应用触发机制
MQSeries应用程序不必总是在运行中的。当第一个或第几个信息到达一个指定的队列时,一个应用可以有选择的被触发起来,这样可以做到应用程序的运行时随机的,基于任务的,并不是可预知的。同时,由于许多不常用的应用不必同时都在运行着,大大节省了系统资源。
3###信息浏览
应用程序可以只是察看而非取走信息。
4###信息优先选项
可通过给信息指定优先级的选项,使得信息在队列中以优先级排队处理。
MQSeries基本概念:
1###消息
消息就是MQSerise中的信元。它由应用数据和消息描述符(MQMD)构成。
应用数据的内容和结构是有应用程序定义的,对MQSeries透明。
消息描述符(MQMD)也称消息头,应用程序发送信息时,指定要发送的一个应用数据及控制信息〉MQSeries将控制信息组织成一个MQMD结构加到应用数据上,从而构成一个消息。
MQMD包括如下结构成员:
1###消息类型(MsgType)
(1)报文消息(Datagram)不要求响应
(2)请求消息(Request)要求响应的消息
(3)响应消息(Reply)请求消息的响应消息
(4)报告消息(Report)描述时间如发生错误的消息
2###实效时间(Expiry)
由应用程序指定,消息在传输过程中、保存在队列中或处理时由队列管理器或应用 程序逐步递减。到零时,由队列管理器负责删除。
3###优先级(Priority)应用程序指定
4###持续性(Persistence)在队列管理器故障时不会丢失,由消息日至恢复。
5###消息标识(MsgId)由应用程序或队列管理器生成。
6###相关标识(CorrelId)用于把一个消息和另一个消息联系起来的标识,由应用程序或队列管理器生成。
7###应用标识数据(ApplIdentityData)由应用程序将消息放入队列指定。
消息的最大长度为100兆。
2###队列
队列是用于存储消息的数据结构,每个队列都属于一个队列管理器,队列管理器负责维护他的拥有的队列,并将收到的消息存储到适当的队列。队列的最大容量是2GB。
队列可分为:
1###预定义队列
有管理员用MQSeries命令创建。它们是永久的,它们的存在与使用它们的应用程序无关。
2###动态队列
应用程序发出一个MQOPEN调用时,如果制定打开的是模型队列,则队列管理器创建一个动态队列。也可以指定动态队列为永久的,在模型队列里的一个属性。动态队列可以是临时队列,也可以为永久队列。
MQSeries的对象:
1###队列管理器
队列管理器负责为应用程序提供排队服务,并管理属于他的队列。他保证:
1%%%根据收到的命令更改对象的属性。
2%%%特殊时间(如触发起或设备事件)会在符合条件的情况下发生
3%%%根据应用程序进行MQPUT调用的请求,把消息放入正确的队列。如果不能完成则通知应用程序并给出适当的原因码。
每个队列都属于单个队列管理器并被认为是该队列管理器的本地队列。应用程序连接的队列管理器被认为是该应用程序的本地队列管理器。对于应用程序,属于它本地管理器的队列是本地队列。远程队列是指属于另一个队列管理器的队列。远程队列管理器是指除本地队列管理器之外的任何其他队列管理器。远程队列管理器可存在与网络中的远程机器上。或者与本地队列管理器同在一台机器上(如同一台机器上部署了不同的应用程序)。
2###队列
队列是MQSeries消息排队的基础,是用MQSC DEFINE命令或PCF创建队列命令定义MQSeries队列,定义队列时可指定队列的类型和其它属性。
MQSeries定义了四种类型的队列对象:
1%%%本地队列对象
本地队列对象又有如下几种:
1***应用队列
2***启动队列
对列管理器检测到某些条件满足时,就会产生一个触发消息放到启动队列,触发监视器把触发消息从启动队列中取出,并启动触发消息中指定的应用程序。如果队列管理器使用触发,必须至少定义一个启动队列。
3***传输队列
用于远程管理。
4***命令队列
5***死信队列
6***响应队列
7***事件队列
8***群集支持队列
2%%%远程队列对象
3%%%别名队列对象
队列的逻辑名,修改应用程序使用的队列是不需要修改应用程序,只需要修改别名队列对象的定义以反映出别名将解析的新队列名称即可。
4%%%模型队列对象
当应用程序发出MQOPEN请求,且指定的队列是模型队列时,由队列管理器动态创建的。
3###通道
通道是队列管理器间的逻辑通信链路。一个队列管理器要和另一个队列管理器通信,必须在发送方定义一个通道对象,并在接受方定义另一个相配的通道对象。
4###进程定义
进程定义对象定义了在响应MQSeires队列管理器上的触发事件时由触发监视器启动的应用程序。命令DEFINE PROCESS。
管理队列管理器
1###创建队列管理器[MQSeries command:crtmqm -q -u -d]
在创建队列管理器之前需要注意的地方:
1%%%检查队列管理器名称是否唯一,如果不唯一则无法为分布式排队创建通道。
2%%%限制队列管理器的数目,因为每个队列管理器都需要它自己的资源。
3%%%指定缺省的队列管理器,以免MQCONN的调用未指定管理器名时出现异常。
4%%%指定死信队列,如果没有,应用程序中的错误可能会导致关闭通道,或者接受不到对管理命令的响应。
5%%%指定缺省的传输队列。
6%%%指定日志参数。
2###启动队列管理器[MQSeries command:strmqm]
3###停止队列管理器[MQSeries command:endmqm]
有四种不同的停止方式:
1%%%受控停止[-c -w(等待所有应用程序停止并队列管理器停止)]
2%%%立即停止[-i]允许当前MQI调用完成。
3%%%抢先停止[-p]危险的操作
4###删除队列管理器[MQSeries command: dltmqm]
通道有四种类型:sender、receiver、server、requester
几种可能的通道配置:
1###sender-receiver:sender启动通道,receiver响应请求,然后sender从其传输队列取出消息发给receiver,receiver将收到的信息放到目的队列。
2###request-server:由requester启动通道,server响应启动请求,从其传输队列取出消息发给requester。指定了连接名的server通道即可由requester启动,也可以启动requester。
3###requester-sender通道:先由requester启动,而sender终止连接,然后由sender重启通道,从其传输队列取出消息发送到requester,也称回调。
4server-receiver通道:如果在定义server通道时指定了通道另一端的连接名,server-receiver通道与sender-receiver通道相同。通道启动必须由server发起。
消息通道代理:通道的每个末端都有定义一个消息通道代理(MCA),它控制发送和接收消息。MCA的作业是从传输队列取得消息,并将这些消息存放到队列管理器之间的通信链路上。
可以使用远程队列定义作为远程队列的本地定义,通过在本地队列管理器上创建一个远程对列定义来标识另一个队列管理器上的本地队列。