一晚上的心痛经历! 终于换来今天的网上皆识! 嘻嘻 自己最大的优点就是做白日梦------

    mqseries 允许应用程式使用 消息队列来参与消息驱动的进程。应用程序可以适当的消息队列软件产品来跨越平台的差异而互相通信。这样的中间件产品就屏蔽了底层的通讯机制,达到了消息发送接收的表面统一性。
    MQSeries 产品实现了一个通用的称为消息队列接口的编程界面(message queue interface & MQI)。这个通用的编程接口屏蔽了不同操作系统的差异性,使得你可以将构建于她之上的程序轻易的移植到另外的平台上。  对于消息队列,消息的交互是与时间无关的。也就是说,发送、接收消息的程式可以异步运行。两者是相互分离的,发送端在发送消息的时候没有等待接收方反馈的必要。甚至,当消息被某一方发送时,另一方都不必运行,当她运行时,她自己可以找回所属的消息。一旦消息到达相应的队列,消息可以通过一种称之为触发的机制来自动启动目标机的应用程式。有必要的化,通过某种设置,该应用程式可以在消息被处理完后自动挂起。
    消息,是什么? 消息就是对于应用程式有意义的一串字节流。消息用来传递信息的。当然,信息一定是有用的。MQSeries 可以运行在不同的平台之上。这一点,我在第一篇中已经做了详细的描述。MQ Series 中的消息由两个部分组成。第一部分是应用程式的数据,内容和结构都由相应的程式定义。第二部分是消息描述符,她确实了消息,而且包括附加的诸如消息类型、发送程式所分配给消息的优先级等信息。消息描述符是由Mqseries来定义的。 消息的最大长度可以达100 MB,实际上,消息的长度是由以下因素决定的:1、接收队列的最大长度定义;2、队列管理器的消息最大长度定义;3、发送或者是接收程式的定义;4、可用存储空间。
    队列是什么? 队列是用来存储消息的一种数据结构。消息可以是发送的应用程式放进队列里的,或者是某个队列管理器放进自己的队列中。队列的最大容量是2GB。
    应用程式如何发送和接收消息? 通常使用消息队列接口调用(mqi calls)。比如,首先通过MQI MQOPEN call 调用打开所需的队列;使用MQI MQPUT 命令来把消息放进队列中;然后,另外的应用程式就可通过MQI MQGET 命令从该队列中检索到所需的消息。当然,这两个程式完全可以异步运行的。
    队列根据他们的创建方式可以分为预定义的队列、动态队列。预定义的队列是管理员使用适合的命令创建的。这种队列是永久的,他们的存在与否和使用他们进行消息传递的程序是相互独立的。一旦MQSeries 被重新启动,他们就启动了。 当某一应用程式通过OPEN 命令发出请求,指定一个队列模型的时候就创建了动态队列。动态队列的创建基于队列模板的定义。你可以使用 DEFINE QMODEL 命令来定义一个队列模板。这有些象面向对象语言中的类的概念,动态队列中的一些属性,比如可以容纳的最大消息数是从模板中继承的。队列模板中还有这样一个属性,可以指定所创建的动态队列是永久的还是暂时的。在队列管理器、使用该队列的应用程式重新启动时,永久属性的动态队列和预定义队列一样启动了,但是暂时属性的就不存在啦!
    前面已经提到接收消息的程式可以在队列中找回她所需要的消息,而不必在发送程式发送消息时就工作。这样的优点是不是象现在的qq 或者 短信!异曲同工之妙啊!从算法的角度看,授权的应用程式使用了以下的算法:FIFO (First-in-first-out);还有就是根据消息描述符中定义的消息的优先级,即高优先级的消息先接收,同优先级的则根据 FIFO算法来;另外的情况即,应用程式指明她所需求的消息。使用哪种检索方法取决于程式所发出的 MQGET请求。
    对象,我越来越觉得Mqseries的面向对象性了。mq 中也有这样的集属性、动作或者函数、过程之类的为一起的抽象体。在MQSeries V5.1 中,对象类型包括队列管理器、队列、进程定义、管道、群集(比如前面提到的队列管理器群集)、命名表(namelist)。
    对象的操纵或管理包括:开始、结束队列管理器;为应用程式创建对象、特别是队列;通过管道(channels)创建通信路径(paths)和在其他的或者说远程系统上运行的队列管理器进行通信,以传送消息;创建队列管理器群集来简化总体的管理进程,或者达到平衡工作量的目的。 MQ 中对象采用的命名惯例取决于你所想要创建的对象。
    每一个队列管理器的实例都有自己的独一无二的名字,在互联的队列管理器中,是唯一标识自己的。所以,一个队列管理器能够很明确地标示出消息所应送到目标队列管理器。而其它类型的对象,每个都有自己的名字。我们可以通过名字来代表对象。自然这些名字都是唯一的,对于某种对象类型的一个队列管理器。比如,你的mq 中可以有一个相同名字的队列和进程,但是绝对不可以有两个相同名字的队列。我想,管理员在创建一个新的队列管理器或者对象时,MQ Series 系统肯定会在已经存在的 Namelist 中检索,看看有没有同名的。这和我们人就不一样了,长辈在给小孩起名时哪里会知道这大千世界中到底会有多少人和它们脑中想的一样呢!自然,就有了很多同名的。这也是为什么我们要另外去用身份证去标识一个人的缘故吧!身份证号码就如同这里的 object name!
    在MQSeries中,名字最多可有48个字符组成。当然,任何事情好像都有例外。这是人类世界的潜规则,我不知道是不是真理,还是由于中间件这样的软件产品本身就是人创造的,自然,会有缺陷!或者是设计者的有意。对于管道(channel),只可以最多有20个字符。
    你可以创建(create)、改变(alter)、显示(display)、删除(delete)对象。首先是通过控制命令来执行;或者是MQSeries 命令(MQSC),这样的可以从键盘输入、或者从文本中读入;还有一种是可编程命令格式(programmable command format /PCF ),它通常是用在自动程式中。比如远端传来的消息要求接收端去创建对象,就可通过这种PCF来实现。基于MQSeries 的编程也可以使用MQAI(MQSeries administration interface)调用来实现对象的操作。当然,在windows nt 下的对象操作会有一些特别的模型来实现,比如COM 调用、动态目录服务接口调用、MQ 网络管理程序等等。   对象的属性决定了它的表现、特性。有些你可以指定,有些你只能察看。我觉得只要学习过面向对象语言诸如C++的人应该很容易理解这里的意思。在你定义队列之前,你可以指定它所能最多容纳的消息数,但是一旦创建后,你就只能去察看了。在MQ Series中,有两种方法来查阅对象的属性!一种是用PCF名。比如,MaxMsgLength。一种是MQSC名。比如,MAXMSGL。
    队列管理器,为应用程式提供了队列服务,还管理着她所拥有的队列。她确保了(1)根据接收到的命令来更改对象属性;(2)一旦遇到预定的情形,会产生特定的触发事件;(3)消息被放进正确的队列中。根据程式的要求发出 MQPUT 调用。在不能被执行时,给调用程式传递信息,或者是错误代码来响应源程式。每一个队列都属于一个单一的队列管理器。队列之于队列管理器我觉得就如同一个多一映射。对于队列管理器来说,它所管理的队列都是本地队列。 类似的,也有本地队列管理器的概念啦! 不过我觉得,真要是编程时,本地和远端这样的区别应该不是主要的。概念只是有助于人们去理解,并不是事物的解决方法! 人们往往在概念的基础上来提出新的概念,就好像事物是不断被创新的,但是在面对根本的问题时,解决方法则是一样的,或者换汤不换药。改个面目而已!
            42/445

你可能感兴趣的:(一晚上的心痛经历! 终于换来今天的网上皆识! 嘻嘻 自己最大的优点就是做白日梦------)