1、消息在broker上的目的地Queue :消息队列 Topic :主题 Message :消息 Producer :消息产生者 Consumer :消息消费者Client :客户端,生产者和消费者都在客户端上 Server :Activemq服务器BrokerUri :客户端访问服务器上broker时的Uri2 其它资料请参考开发前准备在开发前必须先安装activemq-cpp及winkeemq-cpp库,具体步骤参考activemq-cpp安装及使用文档.doc3 CMS 3.1 概述CMS(stands for C+ Messaging Service)是一组C+应用程序接口(C+ API
2、),它提供创建、发送、接收、读取消息的服务。定义了一组和Sun公司和它的合作伙伴设计的CMS API相同的公共应用程序接口和相应语法,使得C+程序能够和其他消息组件进行通信。 CMS是一种与厂商无关的 API,用来访问消息收发系统。它类似于 JDBC (Java Database Connectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 CMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。CMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 CMS 客户机向另一个客户机发送消息。消息是 CMS 中的一种类型对象,由两部分组成:报头和消
3、息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本 (TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。 消息收发系统是异步的,也就是说,CMS 客户机可以发送消息而不必等待回应。比较可知,这完全不同于基于 RPC 的(基于远程过程的)系统,如 EJB 、CORBA 和 Java RMI 的引用实现。在
4、 RPC 中,客户机调用服务器上某个分布式对象的一个方法。在方法调用返回之前,该客户机被阻塞;该客户机在可以执行下一条指令之前,必须等待方法调用结束。在 CMS 中,客户机将消息发送给一个虚拟通道(主题或队列),而其它 CMS 客户机则预订或监听这个虚拟通道。当 CMS 客户机发送消息时,它并不等待回应。它执行发送操作,然后继续执行下一条指令。消息可能最终转发到一个或许多个客户机,这些客户机都不需要作出回应。CMS的通用接口集合以异步方式发送或接收消息。异步方式接收消息显然是使用间断网络连接的客户 机,诸如移动电话和PDA的最好的选择。另外, CMS采用一种宽松结合方式整合企业系统的方法,其主
5、要的目的就是创建能够使用跨平台数据信息的、可移植的企业级应用程序,而把开发人力解放出来。CMS消息服务支持两种消息模型:Point-to-Point消息(P2P)和发布订阅消息(Publish Subscribe messaging,简称Pub/Sub)。CMS规范并不要求供应商同时支持这两种消息模型,但开发者应该熟悉这两种消息模型的优势与缺点。P2P消息模型是在点对点之间传递消息时使用。如果应用程序开发者希望每一条消息都能够被处理,那么应该使用P2P消息模型。与Pub/Sub消息模型不同,P2P消息总是能够被传送到指定的位置。Pub/Sub模型在一到多的消息广播时使用。如果一定程度的消息传递
6、的不可靠性可以被接受的话,那么应用程序开发者也可以使用Pub/Sub消息模型。换句话说,它适用于所有的消息消费程序并不要求能够收到所有的信息或者消息消费程序并不想接收到任何消息的情况。CMS通过允许创建持久订阅来简化时间相关性,即使消息预订者未激活也可以接收到消息。此外,使用 持久订阅还可通过队列提供灵活性和可靠性,而仍然允许消息被发给许多的接收者。 Topic Subscriber topic Subscriber = (topic, subscriptionName); Connection对象表示了到两种消息模型中的任一种的消息系统的连接。服务器端和客户机端对象要求管理创建的CMS连接的
7、状态。连接是由 Connection Factory创建的并且通过JNDI查寻定位。stop (); stop ();应用需要用到的属性; 2. 消息头中原有的一些可选属性; 3. CMS Provider 需要用到的属性。 标准的CMS 消息头包含以下属性: CMSDestination -消息发送的目的地 CMSDeliveryMode -传递模式, 有两种模式: PERSISTENT 和NON_PERSISTENT,PERSISTENT 表示该消息一定要被送到目的地,否则会导致应用错误。NON_PERSISTENT 表示偶然丢失该消息是被允许的,这两种模式使开发者可以在消息传递的可靠性和
8、吞吐量之间找到平衡点。 CMSMessageID 唯一识别每个消息的标识,由CMS Provider 产生。 CMSTimestamp 一个消息被提交给CMS Provider 到消息被发出的时间。 CMSCorrelationID 用来连接到另外一个消息,典型的应用是在回复消息中连接到原消息。 CMSReplyTo 提供本消息回复消息的目的地址。 CMSRedelivered 如果一个客户端收到一个设置了CMSRedelivered 属性的消息,则表示可能该客户端曾经在早些时候收到过该消息,但并没有签收(acknowledged)。 CMSType 消息类型的识别符。 CMSExpirati
9、on 消息过期时间,等于QueueSender 的send 方法中的timeToLive 值或TopicPublisher 的publish 方法中的timeToLive 值加上发送时刻的GMT 时间值。如果timeToLive值等于零,则CMSExpiration 被设为零,表示该消息永不过期。如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。 CMSPriority 消息优先级,从0-9 十个级别,0-4 是普通消息,5-9 是加急消息。CMS 不要求CMS Provider 严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。 消息体(Body) -
10、 CMS API 定义了4种消息体格式,也叫消息类型,你可以使用不同形式发送接收数据并可以兼容现有的消息格式,下面描述这4种类型:消息类型消息体TextMessagestring对象,如xml文件内容MapMessage名/值对的集合,名是string对象,值类型可以是c+任何基本类型BytesMessage字节流ObjectMessage对象类型Message没有消息体,只有消息头和属性。下例演示创建并发送一个TextMessage到一个队列:TextMessage message = ();(msg_text); 构造函数SimpleProducer( const std:string&
11、brokerURI, unsigned int numMessages, const std: destURI, bool useTopic = false, bool clientAck = false ) connection = NULL; session = NULL; destination = NULL; producer = NULL; this-numMessages = numMessages;useTopic = useTopic;brokerURI = brokerURI;destURI = destURI;clientAck = clientAck;initialize
12、();virtual SimpleProducer() cleanup();3.1.1 初始化及销毁 try if( destination != NULL ) delete destination; catch ( CMSException& e ) (); destination = NULL; if( producer != NULL ) delete producer; producer = NULL; try if( session != NULL ) session-close(); if( connection != NULL ) connection-= NULL ) delete session; session = NULL;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1