您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > activemq-cpp开发手册
Activemq-cpp开发手册丁靖2008-05-061引言1.1编写目的快速学习CMS,提高CMS开发效率,提供一个CMS开发参考手册详细API手册请参考功能介绍Activemq-cpp是一个与ActiveMQ交互通讯的C++API开发库,为C++开发者提供了一个访问ActiveMQ的接口。Winkeemq-cpp是一个在Activemq-cpp基础上封装的API库,对一些重复机械的初始化及销毁清除及一些不关心的细节进行了封装,从而简化了编程。1.3术语解析ActiveMQ:开源的消息队列服务器Broker:消息中介,每个消息队列服务器中至少有一个broker,是消息队列的载体Destination:消息在broker上的目的地Queue:消息队列Topic:主题Message:消息Producer:消息产生者Consumer:消息消费者Client:客户端,生产者和消费者都在客户端上Server:Activemq服务器BrokerUri:客户端访问服务器上broker时的Uri其它资料请参考开发前准备在开发前必须先安装activemq-cpp及winkeemq-cpp库,具体步骤参考《activemq-cpp安装及使用文档.doc》3CMS3.1p概述CMS(standsforC++MessagingService)是一组C++应用程序接口(C++API),它提供创建、发送、接收、读取消息的服务。定义了一组和Sun公司和它的合作伙伴设计的CMSAPI相同的公共应用程序接口和相应语法,使得C++程序能够和其他消息组件进行通信。CMS是一种与厂商无关的API,用来访问消息收发系统。它类似于JDBC(JavaDatabaseConnectivity):这里,JDBC是可以用来访问许多不同关系数据库的API,而CMS则提供同样与厂商无关的访问方法,以访问消息收发服务。CMS使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个CMS客户机向另一个客户机发送消息。消息是CMS中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本(TextMessage)、可序列化的对象(ObjectMessage)、属性集合(MapMessage)、字节流(BytesMessage)、原始值流(StreamMessage),还有无有效负载的消息(Message)。消息收发系统是异步的,也就是说,CMS客户机可以发送消息而不必等待回应。比较可知,这完全不同于基于RPC的(基于远程过程的)系统,如EJB1.1、CORBA和JavaRMI的引用实现。在RPC中,客户机调用服务器上某个分布式对象的一个方法。在方法调用返回之前,该客户机被阻塞;该客户机在可以执行下一条指令之前,必须等待方法调用结束。在CMS中,客户机将消息发送给一个虚拟通道(主题或队列),而其它CMS客户机则预订或监听这个虚拟通道。当CMS客户机发送消息时,它并不等待回应。它执行发送操作,然后继续执行下一条指令。消息可能最终转发到一个或许多个客户机,这些客户机都不需要作出回应。CMS的通用接口集合以异步方式发送或接收消息。异步方式接收消息显然是使用间断网络连接的客户机,诸如移动电话和PDA的最好的选择。另外,CMS采用一种宽松结合方式整合企业系统的方法,其主要的目的就是创建能够使用跨平台数据信息的、可移植的企业级应用程序,而把开发人力解放出来。CMS消息服务支持两种消息模型:Point-to-Point消息(P2P)和发布订阅消息(PublishSubscribemessaging,简称Pub/Sub)。CMS规范并不要求供应商同时支持这两种消息模型,但开发者应该熟悉这两种消息模型的优势与缺点。P2P消息模型是在点对点之间传递消息时使用。如果应用程序开发者希望每一条消息都能够被处理,那么应该使用P2P消息模型。与Pub/Sub消息模型不同,P2P消息总是能够被传送到指定的位置。Pub/Sub模型在一到多的消息广播时使用。如果一定程度的消息传递的不可靠性可以被接受的话,那么应用程序开发者也可以使用Pub/Sub消息模型。换句话说,它适用于所有的消息消费程序并不要求能够收到所有的信息或者消息消费程序并不想接收到任何消息的情况。CMS通过允许创建持久订阅来简化时间相关性,即使消息预订者未激活也可以接收到消息。此外,使用持久订阅还可通过队列提供灵活性和可靠性,而仍然允许消息被发给许多的接收者。TopicSubscribertopicSubscriber=topicSession.createDurableSubscriber(topic,subscriptionName);Connection对象表示了到两种消息模型中的任一种的消息系统的连接。服务器端和客户机端对象要求管理创建的CMS连接的状态。连接是由ConnectionFactory创建的并且通过JNDI查寻定位。//取得用于P2P的QueueConnectionFactoryQueueConnectionFactory=queueConnectionFactory();Contextmessaging=newInitialContext();QueueConnectionFactory=(QueueConnectionFactory)Messaging.lookup(“QueueConnectionFactory”);//取得用于pub/sub的TopicConnectionFactoryTopicConnectonFactorytopicConnectionFactory;Contextmessaging=newInitialContext();topicConnectionFactory=(TopicConnectionFactory)messaging.lookup(“TopicConnectionFactory”);注意:用于P2P的代码和用于PublishSubscribe的代码非常相似。如果session被标记为transactional的话,确认消息就通过确认和校正来自动地处理。如果session没有标记为transactional,你有三个用于消息确认的选项。·AUTO_ACKNOWLEDGEsession将自动地确认收到一则消息。·CLIENT_ACKNOWLEDGE客户端程序将确认收到一则消息,调用这则消息的确认方法。·DUPS_OK_ACKNOWLEDGE这个选项命令session“懒散的”确认消息传递,可以想到,这将导致消息提供者传递的一些复制消息可能会出错。这种确认的方式只应当用于消息消费程序可以容忍潜在的副本消息存在的情况。queueSession=queueConnection.createQueueSession(false,session.AUTO_ACKNOWLEDGE);//P2PtopicSession=topicConnection.createTopicSession(false,session.AUTO_ACKNOWLEDGE);//Pub-Sub注意:在本例中,一个session目的从连结中创建,非值指出session是non-transactional的,并且session将自动地确认收到一则消息。CMS现在有两种传递消息的方式。标记为NON_PERSISTENT的消息最多投递一次,而标记为PERSISTENT的消息将使用暂存后再转送的机理投递。如果一个CMS服务离线,那么持久性消息不会丢失但是得等到这个服务恢复联机时才会被传递。所以默认的消息传递方式是非持久性的。即使使用非持久性消息可能降低内务和需要的存储器,并且这种传递方式只有当你不需要接收所有的消息时才使用。虽然CMS规范并不需要CMS供应商实现消息的优先级路线,但是它需要递送加快的消息优先于普通级别的消息。CMS定义了从0到9的优先级路线级别,0是最低的优先级而9则是最高的。更特殊的是0到4是正常优先级的变化幅度,而5到9是加快的优先级的变化幅度。举例来说:topicPublisher.publish(message,DeliveryMode.PERSISTENT,8,10000);//Pub-Sub或queueSender.send(message,DeliveryMode.PERSISTENT,8,10000);//P2P这个代码片断,有两种消息模型,映射递送方式是持久的,优先级为加快型,生存周期是10000(以毫秒度量)。如果生存周期设置为零,这则消息将永远不会过期。当消息需要时间限制否则将使其无效时,设置生存周期是有用的。CMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。·StreamMessage--Java原始值的数据流·MapMessage--一套名称-值对·TextMessage--一个字符串对象·ObjectMessage--一个序列化的Java对象·BytesMessage--一个未解释字节的数据流CMS应用程序接口提供用于创建每种类型消息和设置荷载的方法例如,为了在一个队列创建并发送一个TextMessage实例,你可以使用下列语句:TextMessagemessage=queueSession.createTextMessage();message.setText(textMsg);以异步方式接收消息,需要创建一个消息监听器然后注册一个或多个使用MessageConsumer的CMSMessageListener接口。会话(主题或队列)负责产生某些消息,这些消息被传送到使用onMessage方法的监听者那里。Usingnamespacecms;classExampleListener:publicMessageListener{//把消息强制转化为TextMessage格式publicvoidonMessage(Messagemessage){TextMessagetextMsg=null;//打开并处理这段消息}}当我们创建QueueReceiver和TopicSubscriber时,我们传递消息选择器字符串://P2PQueueReceiverQueueReceiverreceiver;receiver=session.createReceiver(queue,selector);//Pub-SubTopicSubscriberTopicSubscribersubscriber;subscriber=session.createSubscriber(topic,selector);为了启动消息的交付,不论是Pub/Sub还是P2P,都需要调用start方法。TopicConnection.start();//pub-subQueueConnection.start();//P2P当一条消息被捕捉时,这条消息做为一条必须被强制转化为适当消息类型的普通Message对象到达。如TextMessagevoidonMessage(constMessage*message){TextMessagetxtMsg=dynamic_castTextMessage*(message);…//对txtMsg做一些处理}停止消息的传递,无论是Pub/Sub还是P2P,都调用stop方法。TopicConnection.stop();//pub-subQueueConnection.stop();//P2P3.2接口描述CMS支持两种消息类型P2P和Pub/Sub,分别称作:P2PDomain和Pub/
本文标题:activemq-cpp开发手册
链接地址:https://www.777doc.com/doc-2900474 .html