版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、-作者xxxx-日期xxxxactivemq-cpp開發(fā)手冊【精品文檔】Activemq-cpp開發(fā)手冊丁靖2008-05-061 引言1.1 編寫目的快速學(xué)習(xí)CMS,提高CMS開發(fā)效率,提供一個CMS開發(fā)參考手冊詳細API手冊請參考1.2 功能介紹Activemq-cpp是一個與ActiveMQ交互通訊的C+ API開發(fā)庫,為C+開發(fā)者提供了一個訪問ActiveMQ的接口。Winkeemq-cpp是一個在Activemq-cpp基礎(chǔ)上封裝的API庫,對一些重復(fù)機械的初始化及銷毀清除及一些不關(guān)心的細節(jié)進行了封裝,從而簡化了編程。1.3 術(shù)語解析ActiveMQ :開源的消息隊列服務(wù)器Broke
2、r :消息中介,每個消息隊列服務(wù)器中至少有一個broker,是消息隊列的載體Destination :消息在broker上的目的地Queue :消息隊列 Topic :主題 Message :消息 Producer :消息產(chǎn)生者 Consumer :消息消費者Client :客戶端,生產(chǎn)者和消費者都在客戶端上 Server :Activemq服務(wù)器BrokerUri :客戶端訪問服務(wù)器上broker時的Uri其它資料請參考2 開發(fā)前準(zhǔn)備在開發(fā)前必須先安裝activemq-cpp及winkeemq-cpp庫,具體步驟參考3 CMS 3.1 概述CMS(stands for C+ Messagin
3、g Service)是一組C+應(yīng)用程序接口(C+ API),它提供創(chuàng)建、發(fā)送、接收、讀取消息的服務(wù)。定義了一組和Sun公司和它的合作伙伴設(shè)計的CMS API相同的公共應(yīng)用程序接口和相應(yīng)語法,使得C+程序能夠和其他消息組件進行通信。 CMS是一種與廠商無關(guān)的 API,用來訪問消息收發(fā)系統(tǒng)。它類似于 JDBC (Java Database Connectivity):這里,JDBC 是可以用來訪問許多不同關(guān)系數(shù)據(jù)庫的 API,而 CMS 則提供同樣與廠商無關(guān)的訪問方法,以訪問消息收發(fā)服務(wù)。CMS 使您能夠通過消息收發(fā)服務(wù)(有時稱為消息中介程序或路由器)從一個 CMS 客戶機向另一個客戶機發(fā)送消息。
4、消息是 CMS 中的一種類型對象,由兩部分組成:報頭和消息主體。報頭由路由信息以及有關(guān)該消息的元數(shù)據(jù)組成。消息主體則攜帶著應(yīng)用程序的數(shù)據(jù)或有效負載。根據(jù)有效負載的類型來劃分,可以將消息分為幾種類型,它們分別攜帶:簡單文本 (TextMessage)、可序列化的對象 (ObjectMessage)、屬性集合 (MapMessage)、字節(jié)流 (BytesMessage)、原始值流 (StreamMessage),還有無有效負載的消息 (Message)。 消息收發(fā)系統(tǒng)是異步的,也就是說,CMS 客戶機可以發(fā)送消息而不必等待回應(yīng)。比較可知,這完全不同于基于 RPC 的(基于遠程過程的)系統(tǒng),如 E
5、JB 1.1、CORBA 和 Java RMI 的引用實現(xiàn)。在 RPC 中,客戶機調(diào)用服務(wù)器上某個分布式對象的一個方法。在方法調(diào)用返回之前,該客戶機被阻塞;該客戶機在可以執(zhí)行下一條指令之前,必須等待方法調(diào)用結(jié)束。在 CMS 中,客戶機將消息發(fā)送給一個虛擬通道(主題或隊列),而其它 CMS 客戶機則預(yù)訂或監(jiān)聽這個虛擬通道。當(dāng) CMS 客戶機發(fā)送消息時,它并不等待回應(yīng)。它執(zhí)行發(fā)送操作,然后繼續(xù)執(zhí)行下一條指令。消息可能最終轉(zhuǎn)發(fā)到一個或許多個客戶機,這些客戶機都不需要作出回應(yīng)。 CMS的通用接口集合以異步方式發(fā)送或接收消息。異步方式接收消息顯然是使用間斷網(wǎng)絡(luò)連接的客戶 機,諸如移動電話和PDA的最好的
6、選擇。另外, CMS采用一種寬松結(jié)合方式整合企業(yè)系統(tǒng)的方法,其主要的目的就是創(chuàng)建能夠使用跨平臺數(shù)據(jù)信息的、可移植的企業(yè)級應(yīng)用程序,而把開發(fā)人力解放出來。CMS消息服務(wù)支持兩種消息模型:Point-to-Point消息(P2P)和發(fā)布訂閱消息(Publish Subscribe messaging,簡稱Pub/Sub)。CMS規(guī)范并不要求供應(yīng)商同時支持這兩種消息模型,但開發(fā)者應(yīng)該熟悉這兩種消息模型的優(yōu)勢與缺點。P2P消息模型是在點對點之間傳遞消息時使用。如果應(yīng)用程序開發(fā)者希望每一條消息都能夠被處理,那么應(yīng)該使用P2P消息模型。與Pub/Sub消息模型不同,P2P消息總是能夠被傳送到指定的位置。P
7、ub/Sub模型在一到多的消息廣播時使用。如果一定程度的消息傳遞的不可靠性可以被接受的話,那么應(yīng)用程序開發(fā)者也可以使用Pub/Sub消息模型。換句話說,它適用于所有的消息消費程序并不要求能夠收到所有的信息或者消息消費程序并不想接收到任何消息的情況。CMS通過允許創(chuàng)建持久訂閱來簡化時間相關(guān)性,即使消息預(yù)訂者未激活也可以接收到消息。此外,使用 持久訂閱還可通過隊列提供靈活性和可靠性,而仍然允許消息被發(fā)給許多的接收者。 Topic Subscriber topic Subscriber = topicSession.createDurableSubscriber(topic, subscriptio
8、nName); Connection對象表示了到兩種消息模型中的任一種的消息系統(tǒng)的連接。服務(wù)器端和客戶機端對象要求管理創(chuàng)建的CMS連接的狀態(tài)。連接是由 Connection Factory創(chuàng)建的并且通過JNDI查尋定位。 /取得用于 P2P的 QueueConnectionFactory QueueConnectionFactory = queueConnectionFactory(); Context messaging = new InitialContext(); QueueConnectionFactory = (QueueConnectionFactory) Messaging.lo
9、okup(“QueueConnectionFactory”); /取得用于 pub/sub的 TopicConnectionFactory TopicConnectonFactory topicConnectionFactory; Context messaging = new InitialContext(); topicConnectionFactory= (TopicConnectionFactory)messaging.lookup(“TopicConnectionFactory”); 注意:用于P2P的代碼和用于PublishSubscribe的代碼非常相似。如果session被標(biāo)記
10、為transactional的話,確認消息就通過確認和校正來自動地處理。如果session沒有標(biāo)記為 transactional,你有三個用于消息確認的選項。 AUTO_ACKNOWLEDGE session將自動地確認收到一則消息。 CLIENT_ACKNOWLEDGE 客戶端程 序?qū)⒋_認收到一則消息,調(diào)用這則消息的確認方法。 DUPS_OK_ACKNOWLEDGE 這個選項命令session“懶散的”確認消息傳遞,可以想到,這將導(dǎo)致消息提供者傳遞的一些復(fù)制消息可能會出錯。這種確認的方式只應(yīng)當(dāng)用于消息消費程序 可以容忍潛在的副本消息存在的情況。 queueSession =queueConn
11、ection.createQueueSession(false,session.AUTO_ACKNOWLEDGE);/P2P topicSession = topicConnection.createTopicSession(false, session.AUTO_ACKNOWLEDGE); /Pub-Sub注意:在本例中,一個session目的從連結(jié)中創(chuàng)建,非值指出session是non-transactional的,并且 session將自動地確認收到一則消息。CMS現(xiàn)在有兩種傳遞消息的方式。標(biāo)記為NON_PERSISTENT的消息最多投遞一次,而標(biāo)記 為PERSISTENT的消息將使用暫
12、存后再轉(zhuǎn)送的機理投遞。如果一個CMS服務(wù)離線,那么持久性消息不會丟失但是得等到這個服務(wù)恢復(fù)聯(lián)機時才會被傳遞。 所以默認的消息傳遞方式是非持久性的。即使使用非持久性消息可能降低內(nèi)務(wù)和需要的存儲器,并且這種傳遞方式只有當(dāng)你不需要接收所有的消息時才使用。雖然 CMS規(guī)范并不需要CMS供應(yīng)商實現(xiàn)消息的優(yōu)先級路線,但是它需要遞送加快的消息優(yōu)先于普通級別的消息。CMS定義了從0到9的優(yōu)先級路線級別,0是最低 的優(yōu)先級而9則是最高的。更特殊的是0到4是正常優(yōu)先級的變化幅度,而5到9是加快的優(yōu)先級的變化幅度。舉例來說: topicPublisher.publish (message, DeliveryMode
13、.PERSISTENT, 8, 10000); /Pub-Sub 或 queueSender.send(message, DeliveryMode.PERSISTENT, 8, 10000);/P2P 這個代碼片斷,有兩種消息模型,映射遞送方式是持久的,優(yōu)先級為加快型,生存周期是10000 (以毫秒度量 )。如果生存周期設(shè)置為零,這則消息將永遠不會過期。當(dāng)消息需要時間限制否則將使其無效時,設(shè)置生存周期是有用的。CMS定義了五種不同的消息正文格式,以及調(diào)用的消息類型,允許你發(fā)送并接收以一些不同形式的數(shù)據(jù),提供現(xiàn)有消息格式的一些級別的兼容性。 StreamMessage - Java原始值的數(shù)據(jù)流
14、 MapMessage-一套名稱-值對 TextMessage-一個字符串對象 ObjectMessage-一個序列化的 Java對象 BytesMessage-一個未解釋字節(jié)的數(shù)據(jù)流CMS應(yīng)用程序接口提供用于創(chuàng)建每種類型消息和設(shè)置荷載的方法例如,為了在一個隊列創(chuàng)建并發(fā)送一個 TextMessage實例,你可以使用下列語句: TextMessage message = queueSession.createTextMessage(); message.setText(textMsg); 以異步方式接收消息,需要創(chuàng)建一個消息監(jiān)聽器然后注冊一個或多個使用MessageConsumer的CMS Me
15、ssageListener接口。會話(主題或隊列)負責(zé)產(chǎn)生某些消息,這些消息被傳送到使用onMessage方法的監(jiān)聽者那里。 Using namespace cms; class ExampleListener : public MessageListener /把消息強制轉(zhuǎn)化為TextMessage格式 public void onMessage(Message message) TextMessage textMsg = null; / 打開并處理這段消息 當(dāng)我們創(chuàng)建QueueReceiver和TopicSubscriber時,我們傳遞消息選擇器字符串: /P2P QueueReceive
16、r QueueReceiver receiver; receiver = session.createReceiver(queue, selector); /Pub-Sub TopicSubscriber TopicSubscriber subscriber; subscriber = session.createSubscriber(topic, selector);(); /pub-sub (); /P2P 當(dāng)一條消息被捕捉時,這條消息做為一條必須被強制轉(zhuǎn)化為適當(dāng)消息類型的普通Message對象到達。如TextMessagevoid onMessage(const Message* mes
17、sage) TextMessage txtMsg=dynamic_cast(message); /對 txtMsg做一些處理停止消息的傳遞,無論是Pub/Sub還是P2P,都調(diào)用stop方法。 TopicConnection. stop (); /pub-sub QueueConnection. stop (); /P2P 3.2 接口描述CMS 支持兩種消息類型P2P 和Pub/Sub,分別稱作:P2P Domain 和Pub/Sub Domain,這兩種接口都繼承統(tǒng)一的CMS Parent 接口,CMS 主要接口如下所示:CMS ParentConnectionFactoryConnect
18、ionDestinationSessionMessageProducerMessageConsumer 以下是對這些接口的簡單描述: ConnectionFactory :連接工廠,CMS 用它創(chuàng)建連接 Connection :CMS 客戶端到CMS Provider 的連接 Destination :消息的目的地 Session: 一個發(fā)送或接收消息的線程 MessageProducer: 由Session 對象創(chuàng)建的用來發(fā)送消息的對象 MessageConsumer: 由Session 對象創(chuàng)建的用來接收消息的對象3.3 CMS消息模型CMS 消息由以下幾部分組成:消息頭,屬性,消息體。
19、消息頭(Header) - 消息頭包含消息的識別信息和路由信息,消息頭包含一些標(biāo)準(zhǔn)的屬性如:CMSDestination,CMSMessageID 等。 消息頭由誰設(shè)置CMSDestinationsend 或 publish 方法CMSDeliveryModesend 或 publish 方法CMSExpirationsend 或 publish 方法CMSPrioritysend 或 publish 方法CMSMessageIDsend 或 publish 方法CMSTimestampsend 或 publish 方法CMSCorrelationID客戶CMSReplyTo客戶CMSType
20、客戶CMSRedeliveredCMS Provider 屬性(Properties) - 除了消息頭中定義好的標(biāo)準(zhǔn)屬性外,CMS 提供一種機制增加新屬性到消息頭中,這種新屬性包含以下幾種: 1. 應(yīng)用需要用到的屬性; 2. 消息頭中原有的一些可選屬性; 3. CMS Provider 需要用到的屬性。 標(biāo)準(zhǔn)的CMS 消息頭包含以下屬性: CMSDestination -消息發(fā)送的目的地 CMSDeliveryMode -傳遞模式, 有兩種模式: PERSISTENT 和NON_PERSISTENT,PERSISTENT 表示該消息一定要被送到目的地,否則會導(dǎo)致應(yīng)用錯誤。NON_PERSIST
21、ENT 表示偶然丟失該消息是被允許的,這兩種模式使開發(fā)者可以在消息傳遞的可靠性和吞吐量之間找到平衡點。 CMSMessageID 唯一識別每個消息的標(biāo)識,由CMS Provider 產(chǎn)生。 CMSTimestamp 一個消息被提交給CMS Provider 到消息被發(fā)出的時間。 CMSCorrelationID 用來連接到另外一個消息,典型的應(yīng)用是在回復(fù)消息中連接到原消息。 CMSReplyTo 提供本消息回復(fù)消息的目的地址。 CMSRedelivered 如果一個客戶端收到一個設(shè)置了CMSRedelivered 屬性的消息,則表示可能該客戶端曾經(jīng)在早些時候收到過該消息,但并沒有簽收(ackn
22、owledged)。 CMSType 消息類型的識別符。 CMSExpiration 消息過期時間,等于QueueSender 的send 方法中的timeToLive 值或TopicPublisher 的publish 方法中的timeToLive 值加上發(fā)送時刻的GMT 時間值。如果timeToLive值等于零,則CMSExpiration 被設(shè)為零,表示該消息永不過期。如果發(fā)送后,在消息過期時間之后消息還沒有被發(fā)送到目的地,則該消息被清除。 CMSPriority 消息優(yōu)先級,從0-9 十個級別,0-4 是普通消息,5-9 是加急消息。CMS 不要求CMS Provider 嚴格按照這十
23、個優(yōu)先級發(fā)送消息,但必須保證加急消息要先于普通消息到達。 消息體(Body) - CMS API 定義了4種消息體格式,也叫消息類型,你可以使用不同形式發(fā)送接收數(shù)據(jù)并可以兼容現(xiàn)有的消息格式,下面描述這4種類型: 消息類型消息體TextMessagestring對象,如xml文件內(nèi)容MapMessage名/值對的集合,名是string對象,值類型可以是c+任何基本類型BytesMessage字節(jié)流ObjectMessage對象類型Message沒有消息體,只有消息頭和屬性。下例演示創(chuàng)建并發(fā)送一個TextMessage到一個隊列: teTextMessage();message.setText(m
24、sg_text); / msg_text is a Stringmessage.setCMSType(“text”);queueSender.send(message);下例演示接收消息并轉(zhuǎn)換為合適的消息類型: Message* m = queueReceiver.receive();If (m-getCMSType() = “text”)TextMessage txt=dynamic_cast(m);/ do somethingelse4 消息生產(chǎn)者客戶端消息生產(chǎn)者產(chǎn)生消息并將消息發(fā)送到broker上的隊列或主題中。要使消息生產(chǎn)者生產(chǎn)的消息被消息消費者消費,必須滿足兩個條件:生產(chǎn)者和消費者必
25、須連接到同一個Broker, 即BrokerUri中主機名和端口相同生產(chǎn)者和消費者必須具有相同的destination, 即同一個隊列名或主題名4.1 使用activemq-cpp來創(chuàng)建消息生產(chǎn)者4.1.1 頭文件及名字空間#include #include #include #include #include #include #include #include using namespace activemq;using namespace activemq:core;using namespace cms;using namespace std;4.1.2 創(chuàng)建一個生產(chǎn)者類class S
26、impleProducer private: Connection* connection; /連接對象 Session* session; /會話 Destination* destination; /消息目的地 MessageProducer* producer; /消息生產(chǎn)者 bool useTopic; /是否采用采用主題模式 bool clientAck; /是否自動確認消息接收 unsigned int numMessages; /生產(chǎn)消息數(shù) std:string brokerURI; /連接borker uri std:string destURI; /隊列或主題名public:
27、/./構(gòu)造函數(shù)SimpleProducer( const std:string& brokerURI, unsigned int numMessages, const std:string& destURI, bool useTopic = false, bool clientAck = false ) connection = NULL; session = NULL; destination = NULL; producer = NULL; this-numMessages = numMessages; this-useTopic = useTopic; this-brokerURI =
28、brokerURI; this-destURI = destURI; this-clientAck = clientAck;initialize();virtual SimpleProducer() cleanup();4.1.3 初始化及銷毀/ 初始化private:Virtual void initialize()try / 創(chuàng)建連接工廠 ActiveMQConnectionFactory* connectionFactory = new ActiveMQConnectionFactory( brokerURI ); / 創(chuàng)建一個到broker的連接 connection = connec
29、tionFactory-createConnection(); connection-start(); / 關(guān)閉連接工廠 delete connectionFactory; / 創(chuàng)建一個會話 if( clientAck ) /消息接收后由消費者客戶端確認 session= connection-createSession( Session:CLIENT_ACKNOWLEDGE ); else /消息接收自動確認 session = connection-createSession( Session:AUTO_ACKNOWLEDGE ); / 創(chuàng)建一個隊列或主題 (Topic or Queue)
30、 if( useTopic ) destination = session-createTopic( destURI ); else destination = session-createQueue( destURI ); / 創(chuàng)建生產(chǎn)者并設(shè)定消息傳送模式 producer = session-createProducer( destination ); producer-setDeliveryMode( DeliveryMode:NON_PERSISTENT );catch ( CMSException& e ) e.printStackTrace(); / 銷毀void cleanup(
31、) / Destroy resources. try if( destination != NULL ) delete destination; catch ( CMSException& e ) e.printStackTrace(); destination = NULL; try if( producer != NULL ) delete producer; catch ( CMSException& e ) e.printStackTrace(); producer = NULL; / Close open resources. try if( session != NULL ) se
32、ssion-close(); if( connection != NULL ) connection-close(); catch ( CMSException& e ) e.printStackTrace(); try if( session != NULL ) delete session; catch ( CMSException& e ) e.printStackTrace(); session = NULL; try if( connection != NULL ) delete connection; catch ( CMSException& e ) e.printStackTr
33、ace(); connection = NULL; 4.1.4 生產(chǎn)一個消息并發(fā)送到隊列中public :void send() / 消息內(nèi)容 string text = (string)Hello world! thread ; for( std:size_t ix=0; ixcreateTextMessage( text ); / 發(fā)送消息 printf( Sent message #%d n, ix+1 ); producer-send( message ); / 釋放消息 delete message;4.1.5 發(fā)送消息主程序Int main(void) / broker urist
34、d:string brokerURI = tcp:/127.0.0.1:61616 ?wireFormat=openwire &transport.useAsyncSend=true/ 發(fā)送消息數(shù)unsigned int numMessages = 2000;/ 消息隊列名std:string destURI = TEST.FOO;/ 使用隊列模式bool useTopics = false; /初始化一個消息生產(chǎn)者對象并發(fā)送消息 SimpleProducer producer( brokerURI, numMessages, destURI, useTopics );producer.sen
35、d();return 0;4.1.6 總結(jié)綜上例子可知,每次發(fā)送一個消息到消息隊列中都需要定義一個生產(chǎn)者類,并完成一個機械的初始化及銷毀過程。為了提高軟件開發(fā)效率,可以模仿生產(chǎn)者類定義一個消息發(fā)送者類,封裝相關(guān)細節(jié),并編譯成共享庫以供使用,簡化編程過程。4.2 使用winkeemq-cpp來創(chuàng)建消息生產(chǎn)者4.2.1 頭文件及名字空間#include using namespace winkeemq;using namespace std;4.2.2 發(fā)送消息主程序int main(int argc, char* argv)/ broker uri std:string brokerURI =
36、tcp:/192.168.1.179:61616 ?wireFormat=openwire &wireFormat.maxInactivityDuration=0 &soKeepAlive=true &transport.useAsyncSend=true;/ 隊列名string mqName=mm.mq;/ 創(chuàng)建一個消息發(fā)送對象(采用隊列模式,每次只發(fā)一個消息)MessageSender ms(brokerURI,1,false,mqName);string body=”hello worldn”;/ 創(chuàng)建一個文本消息TextMessage* msg=dynamic_cast (ms.cre
37、ateMessag(MessageSender:TEXT_MESSAGE);/ 設(shè)定消息體內(nèi)容 msg-setText(body); / 發(fā)送消息 ms.sendMessage();/ 銷毀消息 ms.deleteMessage();4.2.3 總結(jié)由上述例子可看出,采用winkeemq-cpp后代碼量精簡了很多,開發(fā)員不需要關(guān)心那些機械的初始化細節(jié)。要創(chuàng)建一個消息生產(chǎn)者,只需要給定Broker uri, 隊列名,消息目的模式,然后調(diào)用MessageSender的createMessage()創(chuàng)建一個具體類型的消息,createMessage()的參數(shù)是一個在MessageSender中定義的
38、一個無名enum, 指明消息的類型。調(diào)用MessageSender的sendMessage()發(fā)送消息到broker中,最后銷毀消息【精品文檔】5 消息消費者客戶端消息消費者從Broker上的隊列或主題中取出消息并做相應(yīng)的處理。5.1 使用activemq-cpp來創(chuàng)建消息消息者5.1.1 頭文件及名字空間#include #include #include #include #include #include #include #include #include #include #include using namespace activemq;using namespace active
39、mq:core;using namespace cms;using namespace std;5.1.2 創(chuàng)建一個生產(chǎn)者類class SimpleAsyncConsumer : public ExceptionListener, public MessageListener private: Connection* connection; /連接對象 Session* session; /會話 Destination* destination; /消息目的地 MessageConsumer* consumer; /消息消費者 bool useTopic; /是否采用采用主題模式 bool c
40、lientAck; /是否自動確認消息接收 std:string brokerURI; /連接borker uri std:string destURI; /隊列或主題名public:/./構(gòu)造函數(shù) SimpleAsyncConsumer( const std:string& brokerURI, const std:string& destURI, bool useTopic = false, bool clientAck = false ) connection = NULL; session = NULL; destination = NULL; consumer = NULL; thi
41、s-useTopic = useTopic; this-brokerURI = brokerURI; this-destURI = destURI;this-clientAck = clientAck;initialize (); virtual SimpleAsyncConsumer () cleanup();5.1.3 初始化及銷毀private:/ 初始化virtual void initialize()try / 創(chuàng)建連接工廠 ActiveMQConnectionFactory* connectionFactory = new ActiveMQConnectionFactory( br
42、okerURI ); / 創(chuàng)建一個到broker的連接 connection = connectionFactory-createConnection(); connection-start(); / 設(shè)置連接異常偵聽類connection-setExceptionListener(this); / 關(guān)閉連接工廠 delete connectionFactory; / 創(chuàng)建一個會話 if( clientAck ) /消息接收后由消費者客戶端確認 session= connection-createSession( Session:CLIENT_ACKNOWLEDGE ); else /消息接收
43、自動確認 session = connection-createSession( Session:AUTO_ACKNOWLEDGE ); / 創(chuàng)建一個隊列或主題 (Topic or Queue) if( useTopic ) destination = session-createTopic( destURI ); else destination = session-createQueue( destURI ); / 創(chuàng)建消費者并設(shè)定消息接收偵聽類 consumer = session-createConsumer( destination ); consumer-setMessageLis
44、tener( this );catch ( CMSException& e ) e.printStackTrace(); / 銷毀void cleanup() / Destroy resources. try if( destination != NULL ) delete destination; catch ( CMSException& e ) e.printStackTrace(); destination = NULL; try if( producer != NULL ) delete producer; catch ( CMSException& e ) e.printStack
45、Trace(); producer = NULL; / Close open resources. try if( session != NULL ) session-close(); if( connection != NULL ) connection-close(); catch ( CMSException& e ) e.printStackTrace(); try if( session != NULL ) delete session; catch ( CMSException& e ) e.printStackTrace(); session = NULL; try if( co
46、nnection != NULL ) delete connection; catch ( CMSException& e ) e.printStackTrace(); connection = NULL; 5.1.4 從消息隊列中異步接收消息如果隊列中有消息到來,程序會自動調(diào)用onMessage函數(shù),因此只需要在onMessage()中編寫對消息的處理。onMessage()函數(shù)中的message參數(shù)在onMessage()返回后便會自動銷毀,可以通過調(diào)用Message的clone()方法拷貝自身來擴展其生命周期,clone()返回的是在椎上分配的消息,因此需要手動銷毀。virtual void onMessage( const Message* message ) static int count
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商業(yè)秘密保護制度
- 長期加工合同
- 安全事故隱患排查治理制度
- Methyl-heptadecanoate-Standard-生命科學(xué)試劑-MCE
- Methacholine-chloride-Standard-生命科學(xué)試劑-MCE
- Mecamylamine-hydrochloride-Standard-生命科學(xué)試劑-MCE
- 設(shè)備可靠性管理制度
- 政企單位廚房設(shè)計施工方案
- 什么是鋼琴專輔課程設(shè)計
- 支架u型彎曲模課程設(shè)計
- 冬季六防工作方案
- GA/T 911-2019信息安全技術(shù)日志分析產(chǎn)品安全技術(shù)要求
- FZ/T 93048.1-2021針刺機用針第1部分:刺針
- 平板閘閥說明書
- CMDB構(gòu)建與應(yīng)用課件
- 二尖瓣關(guān)閉不全的護理查房-課件
- 黑龍江省學(xué)業(yè)水平測試政治試卷
- 《行政能力測試》課件
- 廣西南寧市八年級上學(xué)期數(shù)學(xué)期末考試試卷
- 上海中考物理專題-計算題失分題專題(學(xué)生版)
- CEMS運行質(zhì)量控制
評論
0/150
提交評論