JMS : Java Message Service (Java消息服务)之一 [转]
為什么80%的碼農都做不了架構師?>>> ??
1 引言
1.1 編寫目的
本文作為B2bi項目中開源產品JORAM的使用指導文檔,旨在幫助項目組人員方便明了的進行JMS模塊的詳細設計和開發工作。本文檔主要包含建設銀行EAI平臺B2Bi子系統中使用的開源JMS產品??JORAM的使用說明
1.2 名詞解釋
B2Bi:
Business to Business integration (企業間集成)
JMS:
Java Message Service (Java消息服務)
JORAM:
ObjectWeb的Java開源項目
JNDI:
Java命名和目錄接口
1.3 參考資料
《Joram-4.3-en.pdf》??JORAM使用手冊(英文)
《Joram4_0_SAMPLES.pdf》??JORAM使用舉例(英文)
《Joram4_0_ADMIN.pdf》??JORAM管理員手冊(英文)
2 JMS簡介
2.1 JMS基本概念
JMS(Java Message Service)是訪問企業消息系統的標準API,它便于消息系統中的Java應用程序進行消息交換,并且通過提供標準的產生、發送、接收消息的接口簡化企業應用的開發。
JMS應用由以下幾部分組成:
JMS provider :是一個消息系統,它實現了JMS 接口并提供管理和控制的功能。
JMS clients :是用Java語言寫的一些程序和組件,它們產生和使用消息。
Messages :是在JMS clients之間傳遞的消息的對象。
Administered objects :是由使用JMS clients 的人生成的預選設置好的JMS 對象。有兩種這樣的對象:destinations和connection factories。
2.2 JMS基本功能
JMS是用于和面向消息的中間件相互通信的應用程序接口。它既支持點對點(point-to-point)的域,又支持發布/訂閱(publish/subscribe)類型的域,并且提供對下列類型的支持:經認可的消息傳遞,事務型消息的傳遞,一致性消息和具有持久性的訂閱者支持。JMS還提供了另一種方式來對您的應用與舊的后臺系統相集成。
2.3 消息服務類型
1) point-to-point (PTP)方式:點到點的模型。消息由一個JMS客戶機(發布者)發送到服務器上的一個目的地,即一個隊列(queue)。而另一個JMS客戶機(訂閱者)則可以訪問這個隊列,并從該服務器獲取這條消息。
point-to-point (PTP)方式有以下特點:
a) 每一個message只有一個使用者。
b) 一個message的sender和receiver沒有時間上的依賴關系。無論sendere有沒有在運行,Receiver都可提取message。
c) Receiver完成對message處理這后,發出確認。
d) 當你所發出的每一個消息必須由一個使用者成功處理的情況下,使用 PTP messaging機制。
2) publish/subscribe (pub/sub)方式:發布-訂閱模型。這里仍然是由一個JMS客戶機將一條消息發布到服務器上的一個目的地上,但是這次這個目的地叫做一個主題(topic),可有多個訂閱者去訪問該消息。消息將一直維持在主題中,直到這個主題的所有訂閱者都取走了該消息的一個副本。消息也包括了一個參數,用于定義了該消息的耐久性(它能夠在服務器上等待訂閱者多長時間)。
Pub/sub messaging有如下的特點:
a) 每一個message可以有多個使用者;
b) Publishers和subscribers在時間上有依賴關系。一個訂閱了某一個topic的客戶,只能使用在它生成訂閱之后發布的message, 并且subscriber必須一直保持活動狀態。
c) JMS API允許客戶生成持久性的訂閱,從而在某種程度上放寬了這種時間上的依賴關系,提高了靈活性處可靠性。
3) Messaging的使用
Messaging本身是異步的,使message的使用者之間沒有時間上的依賴關系。但是,JMS規范給出了更精確的定義,使Message可以以兩種方式被使用:
a) Synchronously同步:subscriber或receiver可以通過調用receive方法實時地從destination上提取message。Receive方法在收到一個 message后結束,或當message 在一定的時間限制內沒有收到時超時結束。
b) Asynchronously異步:客戶可以為某一個使用者注冊一個message listener。message listener和event listener很相似。當一個message到達了destination, JMS provider通過調用listener的onMessage方法將message傳遞過去,由onMessage方法負責處理message。
更詳細的JMS規范可參考SUN相關文檔。
2.4 JMS接口類圖
2.5 JMS基本視圖
1.JMS接口描述
JMS 支持兩種消息類型PTP 和Pub/Sub,分別稱作:PTP Domain 和Pub/Sub Domain,這兩種接口都繼承統一的JMS父接口,JMS 主要接口如下所示:
MS父接口 PTP Pub/Sub
ConnectionFactory QueueConnectionFactory TopicConnectionFactory
Connection QueueConnection TopicConnection
Destination Queue Topic
Session QueueSession TopicSession
MessageProducer QueueSender TopicPublisher
MessageConsumer QueueReceiver,QueueBrowse r TopicSubscriber
ConnectionFactory :連接工廠,JMS 用它創建連接
Connection :JMS 客戶端到JMS Provider 的連接
Destination :消息的目的地
Session: 一個發送或接收消息的線程
MessageProducer: 由Session 對象創建的用來發送消息的對象
MessageConsumer: 由Session 對象創建的用來接收消息的對象
2.JMS消息模型
JMS 消息由以下幾部分組成:消息頭,屬性,消息體。
2.1 消息頭(Header) - 消息頭包含消息的識別信息和路由信息,消息頭包含一些標準的屬性如:JMSDestination,JMSMessageID 等。
消息頭 由誰設置
JMSDestination send 或 publish 方法
JMSDeliveryMode send 或 publish 方法
JMSExpiration send 或 publish 方法
JMSPriority send 或 publish 方法
JMSMessageID send 或 publish 方法
JMSTimestamp send 或 publish 方法
JMSCorrelationID 客戶
JMSReplyTo 客戶
JMSType 客戶
JMSRedelivered JMS Provider
2.2 屬性(Properties) - 除了消息頭中定義好的標準屬性外,JMS 提供一種機制增加新屬性到消息頭中,這種新屬性包含以下幾種:
1. 應用需要用到的屬性;
2. 消息頭中原有的一些可選屬性;
3. JMS Provider 需要用到的屬性。
標準的JMS 消息頭包含以下屬性:
JMSDestination 消息發送的目的地
JMSDeliveryMode 傳遞模式, 有兩種模式: PERSISTENT 和NON_PERSISTENT,PERSISTENT 表示該消息一定要被送到目的地,否則會導致應用錯誤。NON_PERSISTENT 表示偶然丟失該消息是被允許的,這兩種模式使開發者可以在消息傳遞的可靠性和吞吐量之間找到平衡點。
JMSMessageID 唯一識別每個消息的標識,由JMS Provider 產生。
JMSTimestamp 一個消息被提交給JMS Provider 到消息被發出的時間。
JMSCorrelationID 用來連接到另外一個消息,典型的應用是在回復消息中連接到原消息。
JMSReplyTo 提供本消息回復消息的目的地址
JMSRedelivered 如果一個客戶端收到一個設置了JMSRedelivered 屬性的消息,則表示可能該客戶端曾經在早些時候收到過該消息,但并沒有簽收(acknowledged)。
JMSType 消息類型的識別符。
JMSExpiration 消息過期時間,等于QueueSender 的send 方法中的timeToLive 值或TopicPublisher 的publish 方法中的timeToLive 值加上發送時刻的GMT 時間值。如果timeToLive值等于零,則JMSExpiration 被設為零,表示該消息永不過期。如果發送后,在消息過期時間之后消息還沒有被發送到目的地,則該消息被清除。
JMSPriority 消息優先級,從0-9 十個級別,0-4 是普通消息,5-9 是加急消息。JMS 不要求JMS Provider 嚴格按照這十個優先級發送消息,但必須保證加急消息要先于普通消息到達。
2.3 消息體(Body) - JMS API 定義了5種消息體格式,也叫消息類型,你可以使用不同形式發送接收數據并可以兼容現有的消息格式,下面描述這5種類型:
消息類型 消息體
TextMessage java.lang.String對象,如xml文件內容
MapMessage 名/值對的集合,名是String對象,值類型可以是Java任何基本類型
BytesMessage 字節流
StreamMessage Java中的輸入輸出流
ObjectMessage Java中的可序列化對象
Message 沒有消息體,只有消息頭和屬性
下例演示創建并發送一個TextMessage到一個隊列:
TextMessage message = queueSession.createTextMessage();
message.setText(msg_text); // msg_text is a String
queueSender.send(message);
下例演示接收消息并轉換為合適的消息類型:
Message m = queueReceiver.receive();
if (m instanceof TextMessage) {
TextMessage message = (TextMessage) m;
System.out.println("Reading message: " + message.getText());
} else {
// Handle error
}
3. 消息的同步異步接收
消息的同步接收是指客戶端主動去接收消息,JMS 客戶端可以采用MessageConsumer 的receive方法去接收下一個消息。
消息的異步接收是指當消息到達時,主動通知客戶端。JMS 客戶端可以通過注冊一個實 現MessageListener 接口的對象到MessageConsumer,這樣,每當消息到達時,JMS Provider 會調用MessageListener中的onMessage 方法。
4. PTP模型
PTP(Point-to-Point)模型是基于隊列的,發送方發消息到隊列,接收方從隊列接收消息,隊列的存在使得消息的異步傳輸成為可能。和郵件系統中的郵箱一樣,隊列可以包含各種消息,JMS Provider 提 供工具管理隊列的創建、刪除。JMS PTP 模型定義了客戶端如何向隊列發送消息,從隊列接收消息,瀏覽隊列中的消息。
下面描述JMS PTP 模型中的主要概念和對象:
名稱 描述
Queue 由JMS Provider 管理,隊列由隊列名識別,客戶端可以通過JNDI 接口用隊列名得到一個隊列對象。
TemporaryQueue 由QueueConnection 創建,而且只能由創建它的QueueConnection 使用。
QueueConnectionFactory 客戶端用QueueConnectionFactory 創建QueueConnection 對象。
QueueConnection 一個到JMS PTP provider 的連接,客戶端可以用QueueConnection 創建QueueSession 來發送和接收消息。
QueueSession 提供一些方法創建QueueReceiver 、QueueSender、QueueBrowser 和TemporaryQueue。如果在QueueSession 關閉時,有一些消息已經被收到,但還沒有被簽收(acknowledged),那么,當接收者下次連接到相同的隊列時,這些消息還會被再次接收。
QueueReceiver 客戶端用QueueReceiver 接收隊列中的消息,如果用戶在QueueReceiver 中設定了消息選擇條件,那么不符合條件的消息會留在隊列中,不會被接收到。
QueueSender 客戶端用QueueSender 發送消息到隊列。
QueueBrowser 客戶端可以QueueBrowser 瀏覽隊列中的消息,但不會收走消息。
QueueRequestor JMS 提供QueueRequestor 類簡化消息的收發過程。QueueRequestor 的構造函數有兩個參數:QueueSession 和queue,QueueRequestor 通過創建一個臨時隊列來完成最終的收發消息請求。
可靠性(Reliability) 隊列可以長久地保存消息直到接收者收到消息。接收者不需要因為擔心消息會丟失而時刻和隊列保持激活的連接狀態,充分體現了異步傳輸模式的優勢。
5. PUB/SUB模型
JMS Pub/Sub 模型定義了如何向一個內容節點發布和訂閱消息,這些節點被稱作主題(topic)。
主題可以被認為是消息的傳輸中介,發布者(publisher)發布消息到主題,訂閱者(subscribe)從主題訂閱消息。主題使得消息訂閱者和消息發布者保持互相獨立,不需要接觸即可保證消息的傳送。
下面描述JMS Pub/Sub 模型中的主要概念和對象:
名稱 描述
訂閱(subscription) 消息訂閱分為非持久訂閱(non-durable subscription)和持久訂閱(durable subscrip-tion),非持久訂閱只有當客戶端處于激活狀態,也就是和JMS Provider 保持連接狀態才能收到發送到某個主題的消息,而當客戶端處于離線狀態,這個時間段發到主題的消息將會丟失,永遠不會收到。持久訂閱時,客戶端向JMS 注冊一個識別自己身份的ID,當這個客戶端處于離線時,JMS Provider 會為這個ID 保存所有發送到主題的消息,當客戶再次連接到JMS Provider時,會根據自己的ID 得到所有當自己處于離線時發送到主題的消息。
Topic 主題由JMS Provider 管理,主題由主題名識別,客戶端可以通過JNDI 接口用主題名得到一個主題對象。JMS 沒有給出主題的組織和層次結構的定義,由JMS Provider 自己定義。
TemporaryTopic 臨時主題由TopicConnection 創建,而且只能由創建它的TopicConnection 使用。臨時主題不能提供持久訂閱功能。
TopicConnectionFactory 客戶端用TopicConnectionFactory 創建TopicConnection 對象。
TopicConnection TopicConnection 是一個到JMS Pub/Sub provider 的連接,客戶端可以用TopicConnection創建TopicSession 來發布和訂閱消息。
TopicSession TopicSession 提供一些方法創建TopicPublisher、TopicSubscriber、TemporaryTopic 。它還提供unsubscribe 方法取消消息的持久訂閱。
TopicPublisher 客戶端用TopicPublisher 發布消息到主題。
TopicSubscriber 客戶端用TopicSubscriber 接收發布到主題上的消息。可以在TopicSubscriber 中設置消息過濾功能,這樣,不符合要求的消息不會被接收。
Durable TopicSubscriber 如果一個客戶端需要持久訂閱消息,可以使用Durable TopicSubscriber,TopSession 提供一個方法createDurableSubscriber創建Durable TopicSubscriber 對象。
恢復和重新派送(Recovery and Redelivery) 非持久訂閱狀態下,不能恢復或重新派送一個未簽收的消息。只有持久訂閱才能恢復或重新派送一個未簽收的消息。
TopicRequestor JMS 提供TopicRequestor 類簡化消息的收發過程。TopicRequestor 的構造函數有兩個參數:TopicSession 和topic。TopicRequestor 通過創建一個臨時主題來完成最終的發布和接收消息請求。
可靠性(Reliability) 當所有的消息必須被接收,則用持久訂閱模式。當丟失消息能夠被容忍,則用非持久訂閱模式。
3 JMS API編程模型
一個JMS應用由以下幾個模塊組成:
3.1 Administered Objects
JMS應用的destinations和connection factories最后是通過管理而不是編程來使用,因為不同的provider使用他們的方法不一樣。
JMS 客戶應該使用統一的接口得到這些objects,從而使用JMS應用可以運行在不同provider上,而不需要修改或修改很少。通常管理員在JNDI上設置administered objects, 然后JMS clients 在JNDI上look up這些對象。
a) Connection Factories:
connection factory 是client用來生成與provider的connection的對象。connection factory封裝了一套由管理員定義的connection configuration參數。每個connection factory 是一個QueueConnectionFactory 或 TopicConnectionFactory接口的實例。
在JMS 客戶程序中, 通常先執行connection factory 的JNDI API lookup。 如下例:
Context ctx = new InitialContext();
QueueConnectionFactory queueConnectionFactory =
(QueueConnectionFactory) ctx.lookup("QueueConnectionFactory");
TopicConnectionFactory topicConnectionFactory =
(TopicConnectionFactory) ctx.lookup("TopicConnectionFactory");
如果調用不帶參數的InitialContext的lookup方法,就在當前classpath 找jndi.properties文件。
b) Destinations:
Destination 是一個對象用于定義用戶產生的messages 的去向或用戶使用的messages 的來源。
在PTP里,destinations被稱作queues, 可以用下面的命令來生成它們:
Queue queue = (Queue) Queue.create("queue");
在pub/sub里, destinations被稱為topics, 可以用下面的J2EE SDK command 來生成它們:
Topic topic = (Topic) Topic.create("topic");
一個JMS應用可以同時使用多個queues 和/或topics。
除了lookup connection factory, 也常要lookup destination。例如:
Topic myTopic = (Topic) ctx.lookup("MyTopic");
Queue myQueue = (Queue) ctx.lookup("MyQueue");
3.2 Connection
Connection封裝了一個與JMS provider的虛擬連接。Connection表示在client和provider service daemon之間打開的TCP/IP socket。可以用connection 生成一個或多個sessions。
就象connection factories, connections有兩種方式:實現QueueConnection或TopicConnection接口。例如, 當有一個QueueConnectionFactory 或TopicConnectionFactory對象, 可以用他們來創造一個connection:
QueueConnection queueConnection =
queueConnectionFactory.createQueueConnection();
TopicConnection topicConnection =
topicConnectionFactory.createTopicConnection();
注意:當應用程序完成后, 必須關閉你所創建的connections。否則JMS provider 無法釋放資源。關閉了connection同時也關閉了sessions和message產生者和message使用者。
queueConnection.close();
topicConnection.close();
在使用messages前, 必須調用connection的start方法。如果要暫時停止傳送message而不關閉connection, 可以調用stop方法。
connection factory 是client用來生成與provider的connection的對象。connection factory封裝了一套由管理員定義的connection configuration參數。每個connection factory 是一個QueueConnectionFactory 或 TopicConnectionFactory接口的實例。
3.3 Session
Session是單線程的context用于產生和使用messages。用Session創建 message producers、message consumers和messages。Session管理message listeners的執行順序。
Ssession提供事務模式,用于將一系列的sends和receives動作組合在一個工作單元里。
Session被標記為事務模式的話,確認消息就通過確認和校正來自動地處理。如果session沒有標記為事務模式,有三個用于消息確認的選項:
? AUTO_ACKNOWLEDGE session將自動地確認收到一則消息。
? CLIENT_ACKNOWLEDGE 客戶端程序將確認收到一則消息,調用這則消息的確認方法。
? DUPS_OK_ACKNOWLEDGE 這個選項命令session“懶散的”確認消息傳遞,可以想到,這將導致消息提供者傳遞的一些復制消息可能會出錯。這種確認的方式只應當用于消息消費程序可以容忍潛在的副本消息存在的情況。
Sessions, 就象connections, 也有兩種方式:實現QueueSession或TopicSession接口。例如:
TopicSession topicSession =
topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
第一個參數表示sessiong不實現事務處理; 第二個參數表示當session成功收到messages后自動確認。
相同的,可以用QueueConnection對象創建QueueSession:
QueueSession queueSession =
queueConnection.createQueueSession(true, 0);
這里, 第一個參數表示session實現事務處理; 第二個參數表示當session成功收到messages后不自動確認。
3.4 Message Producers?消息生產者
message producer是由session創建的一個對象,用于將messages傳遞到目的地。PTP方式的message producer實現QueueSender接口。 pub/sub方式的message producer實現TopicPublisher接口。
例如::
QueueSender queueSender = queueSession.createSender(myQueue);
TopicPublisher topicPublisher = topicSession.createPublisher(myTopic);
用null作為createSender或createPublisher的參數,可以創建一個不確定的producer。用不確定的producer, 可以等到真正send或publish message的時候才指定destination
當創建了一個message producer, 就可以用它來發送messages。例如:
queueSender.send(message);
topicPublisher.publish(message);
3.5 Message Consumer?消息消費者
message consumer也是由session創建的一個對象,用于接收發送到目的地的消息。message consumer允許JMS client到JMS provider注冊感興趣的目的地。JMS provider管理messages從destination到注冊了這個destination的consumers之間的傳送。
PTP方式的message consumer實現QueueReceiver接口。pub/sub方式的message consumer實現TopicSubscriber接口。
例如:
QueueReceiver queueReceiver = queueSession.createReceiver(myQueue);
TopicSubscriber topicSubscriber = topicSession.createSubscriber(myTopic);
可以用TopicSession.createDurableSubscriber方法創建一個durable topic subscriber(異步消息訂閱 )。
當創建了一個message consumer, 它就是活動的,就可以用它接收messages??梢杂肣ueueReceiver 或TopicSubscriber的close方法把message consumer變成非活動的。Message的傳送在調用了connection的start方法后才開始。
不論是QueueReceiver或TopicSubscriber, 都可以用receive方法來同步consume message??梢栽谡{用start方法后的任何時間調用它:
queueConnection.start();
Message m = queueReceiver.receive();
topicConnection.start();
Message m = topicSubscriber.receive(1000); // time out after a second
異步consume message, 可以使用message listener。
a) Message Listeners
message listener是一個對象,用作充當messages的異步事件處理器。它實現了MessageListener接口, 它只有一個方法:onMessage。 在onMessage方法內, 可以定義當收到一個message后做的事情。
用setMessageListener方法在某個QueueReceiver 或TopicSubscriber里注冊message listener。例如:
TopicListener topicListener = new TopicListener();
topicSubscriber.setMessageListener(topicListener);
當注冊了message listener, 調用QueueConnection或TopicConnection的方法來開始傳送message。
當message開始傳送, 當有message送來,message consumer自動調用message listener的 onMessage方法。onMessage方法只有一個Message類型的參數。
message listener并不對應特定的destination類型. 相同的listener可以從queue或topic上得到message, 這取決于listener是由QueueReceiver還是 TopicSubscriber對象設置的。然而message listener通常對應某一個message類型或格式, 如果要回應messages, message listener必須創建一個message producer。
onMessage方法應該處理所有的exceptions。
Session負責管理message listeners的執行順序。任何時候,只有一個message listeners在運行。
b) Message Selectors
如果你的消息應用程序需要過濾收到的messages, 可以用JMS API中的message selector來讓message consumer定義它所感興趣的messages。Message selectors負責過濾到JMS provider的message,而不是到應用程序的。
message selector是一個含有表達式的字符串。表達式的語法是SQL92 conditional expression syntax的一個子集。當創建message consumer時, createReceiver, createSubscriber, 和createDurableSubscriber方法都可以定義某個message selector作為參數。
message consumer只接收headers和properties與selector匹配的messages。message selector不能根據message body的內容進行選擇。
3.6 Message?消息組成
JMS 消息由以下幾部分組成:消息頭,屬性,消息體
消息頭(Header) - 消息頭包含消息的識別信息和路由信息,消息頭包含一些標準的屬性如:JMSDestination,JMSMessageID 等。
消息頭 由誰設置
JMSDestination send 或 publish 方法
JMSDeliveryMode send 或 publish 方法
JMSExpiration send 或 publish 方法
JMSPriority send 或 publish 方法
JMSMessageID send 或 publish 方法
JMSTimestamp send 或 publish 方法
JMSCorrelationID 客戶
JMSReplyTo 客戶
JMSType 客戶
JMSRedelivered JMS Provider
屬性(Properties) - 除了消息頭中定義好的標準屬性外,JMS 提供一種機制增加新屬性到消息頭中,這種新屬性包含以下幾種:
1. 應用需要用到的屬性;
2. 消息頭中原有的一些可選屬性;
3. JMS Provider 需要用到的屬性。
標準的JMS 消息頭包含以下屬性:
JMSDestination --消息發送的目的地
JMSDeliveryMode --傳遞模式, 有兩種模式: PERSISTENT 和NON_PERSISTENT,PERSISTENT 表示該消息一定要被送到目的地,否則會導致應用錯誤。NON_PERSISTENT 表示偶然丟失該消息是被允許的,這兩種模式使開發者可以在消息傳遞的可靠性和吞吐量之間找到平衡點。
JMSMessageID 唯一識別每個消息的標識,由JMS Provider 產生。
JMSTimestamp 一個消息被提交給JMS Provider 到消息被發出的時間。
JMSCorrelationID 用來連接到另外一個消息,典型的應用是在回復消息中連接到原消息。
JMSReplyTo 提供本消息回復消息的目的地址。
JMSRedelivered 如果一個客戶端收到一個設置了JMSRedelivered 屬性的消息,則表示可能該客戶端曾經在早些時候收到過該消息,但并沒有簽收(acknowledged)。
JMSType 消息類型的識別符。
JMSExpiration 消息過期時間,等于QueueSender 的send 方法中的timeToLive 值或TopicPublisher 的publish 方法中的timeToLive 值加上發送時刻的GMT 時間值。如果timeToLive值等于零,則JMSExpiration 被設為零,表示該消息永不過期。如果發送后,在消息過期時間之后消息還沒有被發送到目的地,則該消息被清除。
JMSPriority 消息優先級,從0-9 十個級別,0-4 是普通消息,5-9 是加急消息。JMS 不要求JMS Provider 嚴格按照這十個優先級發送消息,但必須保證加急消息要先于普通消息到達。
消息體(Body) - JMS API 定義了5種消息體格式,也叫消息類型,你可以使用不同形式發送接收數據并可以兼容現有的消息格式,下面描述這5種類型:
消息類型 消息體
TextMessage java.lang.String對象,如xml文件內容
MapMessage 名/值對的集合,名是String對象,值類型可以是Java任何基本類型
BytesMessage 字節流
StreamMessage Java中的輸入輸出流
ObjectMessage Java中的可序列化對象
Message 沒有消息體,只有消息頭和屬性。
JMS API為每一種messages都提供了一種create方法。例如:
TextMessage message = queueSession.createTextMessage();
message.setText(msg_text); // msg_text is a String
queueSender.send(message);
在使用者一端, 必須將收到的Message 按照適當的message類型處理。 例如:
Message m = queueReceiver.receive();
if (m instanceof TextMessage) {
TextMessage message = (TextMessage) m;
System.out.println("Reading message: " + message.getText());
} else {
// Handle error
}
3.7 Exception Handling
JMS API的方法的Exception的根類是JMSException。JMSException類包括如下子類:
IllegalStateException
InvalidClientIDException
InvalidDestinationException
InvalidSelectorException
JMSSecurityException
MessageEOFException
MessageFormatException
MessageNotReadableException
MessageNotWriteableException
ResourceAllocationException
TransactionInProgressException
TransactionRolledBackException
4 JORAM產品介紹
JORAM是法國電信研究院支持的objectweb.org的開源JMS消息中間件產品。objectweb是一個非?;钴S的開源中間件團體。JORAM支持sun規范,實現JMS1.1。
4.1 Joram4.3包括
一個Message Server(消息服務器),提供Java的消息服務功能。
一個JNDI Server。
一個客戶端類,可以訪問Message Server上的消息。
一個圖形化的管理界面,配置管理Joram平臺。
4.2 系統要求
硬件要求:
2000年后的intel架構pc機
256M RAM 5G硬盤
支持TCP/IP的網絡硬件設備
軟件要求:
操作系統:Linux, Windows 2000 and XP, 等
網絡協議:TCP/IP
Java運行環境:JDK1.4
4.3 Joram產品包目錄結構
doc/ ??Joram產品幫助文檔
samples/ ??Joram產品使用舉例
bin/... ??Joram例子執行程序
config/... ??Joram例子配置文件
class/... ??Joram例子class文件
run/... ??Joram例子運行目錄
src/ ??Joram產品例子源代碼
joram/... ??J2EE環境的Joram源代碼
kjoram/… ??J2ME環境的Joram源代碼
ship/lib/... ??Joram所用的lib包
ship/licenses/... ??Joram的許可證
5 JORAM Classic Samples使用說明
Joram classic samples使用簡單的配置創建一個Message Server,發布一個Queue和一個Topic,并允許匿名用戶訪問。其中包口:一個消息發送的例子、一個消息發布的例子、一個標準的消息生產者的例子、一個消息接收的例子、一個消息訂閱的例子、一個標準的消息消費者的例子、一個瀏覽Queue的例子。Joram平臺運行在穩定模式。
可以利用ant工具直接運行Joram的上述例子
起動Joram消息Server:
ant single_server
也可以用命令行啟動Joram Server,進入$JoramHome/samples/bin/目錄,運行single_server.bat(win)或single_server.sh(unix)。以下操作均有類似的命令行工具。
建立Queue和Topic:
ant classic_admin
運行Sender發送消息例子:
ant sender
運行Receiver接受消息例子:
ant receiver
運行Browser 瀏覽Queue例子:
ant browser
運行消息訂約的例子:
ant subscriber
運行消息發布的例子:
ant publisher
運行消息消費的例子:
ant consumer
運行消息生產的例子:
ant producer
以上操作也可以利用Eclipse3.1集成開發工具,將Joram例子直接導入成Java工程,然后利用例子中的build.xml文件運行。如圖:
右擊build.xml文件選擇Run As ? Ant Build...
彈出窗口如下:每個操作選項后面都有英文的注釋信息,說明操作的內容,可以按照前面運行例子的順序,依次運行即可。
Joram Server也可以通過命令行啟動:
進入Joram產品的$JORAM_HOME/samples/bin目錄,有下列批處理命令,其中.bat文件是windows環境下的命令,.sh文件是unix環境下的命令。
admin.bat? --啟動Joram圖形控制臺界面
admin.sh
classadmin.bat? --在啟動的Joram Server上創建去queue和topic
clean.bat? --清理Joram的運行目錄
clean.sh
jmsclient.bat? --啟動一個JMS客戶端
jmsclient.sh
receive.bat? --啟動一個接收消息進程
send.bat? --啟動一個發送消息進程
single_server.bat? --啟動Joram Server
single_server.sh
sslsingle_server.bat
sslsingle_server.sh
server.sh
引文來源?? JMS : Java Message Service (Java消息服務)之一 - 采云摘月 - 博客園
轉載于:https://my.oschina.net/sunjun/blog/9012
總結
以上是生活随笔為你收集整理的JMS : Java Message Service (Java消息服务)之一 [转]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 3d游戏引擎哪个好_五大开
- 下一篇: 青岛计算机类职业中学,青岛最好的职业学校