chapter1-----mqseries 系列产品的介绍
mqseries 和 message queuing 消息队列
与时间无关的应用程序
消息驱动的处理进程
消息和队列 什么是消息? 1.应用程序数据 2.消息描述符 消息的长度 一个应用程式所需的数
据可能需要好几条消息才能完全。 队列是什么? 是用来存储消息的队列结构。 队列管理器需要管理
它所拥有的队列。
应用程序如何发送、接收消息? 预定义队列和动态队列(根据它们被创建的方式) 比较预定义队列
的存在时间和动态队列中有永久属性的存在时间!一个是在mq产品启动时就存在,另外的是在所属的队列
管理器运行时才存在。
从队列中检索回属于自己的消息 1先进先出算法 2优先级算法 3对明确消息的搜寻 MQGET函数的
参数可以表明程序所采用的检索算法!
对象 包括队列管理器、队列、进程定义、通道(管道)、群集(clusters)和命名表(namelists)。
对对象的操作和管理!
对象名 队列管理器名字的唯一性 其它类型的对象在一个队列管理器中应该是唯一的!(就如同不
同的局部函数的参数名可以相同一样!) 名字最多有48个字符。with the exception of 例外是 管道
名最多有20个字符。
管理对象 通过脚本来执行命令(mqsc) 通过键盘输入命令(control commands) 程序中使用的mq
管理接口调用
对象的属性 在mq中有两种方法可以查看属性 1使用属性的pcf名(正式名字) 2使用mqsc名
队列管理器 1所要完成的任务 2本地队列 本地队列管理器 相对的有远程队列和远程队列管理
器
续:
远程队列管理器是不同于本地队列管理器的任何队列管理器。一个远程队列管理器可以存在于网络中的远
程主机上,也可以和本地队列管理器存在于同一机器上。 mqseries 支持同一系统上的多重队列管理器。
你可以通过MQINQ调用来查询队列管理器对象的属性。 注意到队列对象和队列管理器对象的不同。
MQSeries 队列 1.使用合适的mqsc define命令可以定义队列;2.用pcf创建队列命令来定义队列。
命令确定了队列的类型和属性。比如,当一个应用程序通过mqi调用来查询这个队列时,本地队列对象就
有这样的属性来指定相应的触发过程响应这一调用。
例子如下: 当get命令时,应用程序是否能够从队列中检索到消息;当put命令时,应用程序能够把消
息放进队列;队列的进入是独占性的还是可以为多个程序共享的(临界资源);一次性可以存储入队列中
的最大的消息数目(或称之为队列深度);送入队列中的消息的最大深度。
使用队列对象 在mq 系列中,有四种类型的队列对象。每种类型的对象都能被命令来控制,并且和
相应的真实队列关联。
1本地队列对象
本地队列对象确定了与应用程序相连的队列管理器的一个本地队列。所有属于某一队列管理器的队列都是
本地队列。
2远端队列对象
一个远端队列对象确定了属于另一个队列管理器的队列。对于这一队列管理器,此队列应该是它的本地队
列。当你定义一个远端队列对象时,应该允许本地队列管理器通过你的定义信息来找到相应的远端队列管
理器,这样任何发送到次远端队列的消息都可以传送给正确的队列管理器。(也就是说,信息是一定要通
过管理器才能放入到特定的队列中去) 在应用程式给另一个队列管理器中的队列发消息时,你必须首
先定义一个队列管理器之间的传输队列和通道。要不然,你就把这些队列管理器绑定为一个群集(cluste
r)。
3别名队列对象
一个别名队列允许应用程序使用mqi 调用时不直接的去呼叫某一队列。这有点类似于(仅仅是类似于)动
态联编!只是在运行时,mqi call中的别名才被解析为真实的本地或者是远端队列。这就让你可以通过仅
仅改变别名队列的定义而达到改变你所真正想调用的队列的目的;不必去改变程序本身。
别名队列本质上根本不是个队列,而是一个你用来进入其他队列管理器中队列的途径。
4队列模板对象
它定义了一组队列属性,可以被用作一个模板来创建动态队列。当应用程序向队列管理器发出mqopen请求
时,指定的队列名就是队列模板的名字。通过这一命令来创建动态队列。它的属性是从模板定义中继承的
。它的名字可以事先由应用程序指定或者是队列管理器生成后返回给应用程式。
被MQSeries 所使用的特定的本地队列
必须事先定义好的本地队列,mqseries 使用它们来完成专门的目的。
1应用程序队列
应用程序队列是应用程序通过mqi来调用的队列。它既可以是本地队列管理器中的队列,也可以是远程队
列管理器中的队列。应用程序可以把消息放进远程或者本地队列,但是,它只能从本地队列中获取消息。
2初始化队列
初始化队列是用来触发某种行为的。当触发事件发生的时候,队列管理器把一条触发消息放进初始化队列
中。触发消息是由队列管理器侦测到的各种情况的集合。比如,当队列的消息数量达到预定义的深度时会
产生一个触发事件。这一事件使得队列管理器向专门的初始化队列中放入一条触发消息。这条消息是被触
发监视器(trigger monitor)所检索的,一种专门用来监视初始化队列的程序。然后,监视器就会启动
一个相对应的特定的应用程序来处理这条消息。?
3传输队列
它是一种用来暂时存储去往远端队列管理器的消息的队列。你必须为每一个远端队列管理器定义至少一个
传输队列以便本地队列管理器可以直接的往远端发送消息。这些队列也用在远程管理中。
4群集传输队列
在集群中的每一个队列管理器都有一个群集传输队列,称之为:system.cluster.transmit.queue。这一
队列的定义是由各种操作系统上的mqseries 产品的每一队列管理器默认的。在同一集群中的队列管理器
可以通过这个集群传输队列来向其他的队列管理器发送消息。而集群队列管理器也可以和不同的集群中的
队列管理器相互通信。当然,首先必须定义联接其它的队列管理器的通道和传输队列。这类似于传统的分
布式队列环境。
在名字解析的时候,群集传输队列优先于默认的传输队列。当一个群集以外的队列管理器往远端队列发消
息,如果没有和目的队列管理器相同名字的传输队列,就使用默认的传输队列。(?是不是关联与此远程
队列的传输队列)
当队列管理器是群集的一个部分时,默认的操作是使用system.cluster.transmit.queue这一群集传输队
列,除非目的队列管理器不是群集的一分子。
5死信队列
它是存储那些不能够发送到正确的目的地的消息的队列。这种情况的发生,比如,目的队列已经满了,这
时再向里面发消息肯定就无法到达。用来补充的死信队列被称为system.dead.letter.queue。死信队列有
时也指那些未送达消息的队列。 对于分布式队列,要为每个队列管理器定义一个死信队列。
6命令队列
命令队列称为system.admin.command.queue。授权的程序可以向它发送待处理的mqseries命令。这些命令
随后就被MQ的组件COMMANDS Server检索,command server激活这些命令,把它们送给队列管理器来处理
,返回任何响应给合适的 reply-to队列。 命令队列在队列管理器被创建时就自动创建了!
7反馈队列(reply-to)
当一个应用程序发送一条请求消息的时候,接收方会反馈一条消息给发送方。这条消息是被放在一个队列
中的,称为反馈队列。通常都是关联于发送程序的本地队列,而且,反馈队列的名字是在发送消息的消息
描述符中被发送程序指定的。
8事件队列
mqseries v5产品中支持设备事件(instrumentation events)的纪录。这样,我们可以不依靠mqi应用程
序来监视队列管理器。设备事件的产生有很多种情形:--试图向不存在的队列去发送消息; --即将满载
的队列; --正在启动的通道。
当某一设备事件发生时,队列管理器将会将一条事件消息放入事件队列。如果这条消息暗示了某个问题,
负责监视此队列的程序就会通知管理员或者启动补救操作。 注意:触发事件和设备事件是有很大不同的
。在相同的情形下,不会导致触发事件,但可以产生事件消息。反之亦然!
程序定义
程序定义对象详细说明了在mq队列管理器中的用来响应触发事件的应用程序。 程序定义属性包括程序ID
、程序类型、对程序有用的专门数据。可以使用mqsc命令define process或者是pcf格式的命令来创建程
序定义。
通道(channels)
通道对象提供了队列管理器之间的通信交流的路径。它用来在分布消息队列里的不同队列管理器之间传递
消息。它们为应用程式屏蔽了底层的通信协议。这些队列管理器可以存在于不同的、相同的平台上。你要
为互相通信的管理器中的发送端定义一个通道对象,在接收端定义一个反向的、互补的通道对象。这样才
能使两者相互连通。
群集
在传统的mq网络中,是使用分布队列的。每个队列管理器是独立的。如果一个管理器需要向另一个发送消
息,必须首先定义一个传输队列,一个远端管理器的通道,和远端队列定义。那么群集,是一组队列管理
器,在一个单一性网络中(我的理解是采用相同的网络协议和OS平台下),能够直接相互通信的队列管理
器的集合。这样,就可避免复杂的传输队列、通道、队列定义。
命名表
命名表对象包括了其他mq对象的列表。通常,命名表被诸如触发监控等的应用程序使用。使用命名表的优
势是它可以保持与应用程序的独立性。也就是说,在不停止任何使用它的应用程序的条件下,可以更新。
一旦某一关联命名表的程序挂起了,其它程序仍然可以使用命名表。
命名表通常也用在队列管理器集群中。它可以让你维护多于一个mqseries对象的群集列表。
系统默认对象
系统默认对象是一组当队列管理器被创建时自动创建的对象定义的集合。在安装应用程序时,你可以复制
和修改任何对象的定义。默认的对象名是有system.def词干。比如,默认的本地队列是
system.default.local.queue;默认的接收通道是system.def.receiver。对于这些对象,你是无法改名
的。当你定义一个对象时,任何你没有明确指定的属性都会从默认对象那里复制过来。例如,你定义了一
个本地队列,这些并没有明确指定的属性将从system.default.local.queue队列那里继承过来。(我在这
用了“继承”这个词,实际上还是指完全的复制)46/445