JMS : Java Message Service (Java消息服務)之一 [轉]

1 引言
1.1 編寫目的
本文做爲B2bi項目中開源產品JORAM的使用指導文檔,旨在幫助項目組人員方便明瞭的進行JMS模塊的詳細設計和開發工做。本文檔主要包含建設銀行EAI平臺B2Bi子系統中使用的開源JMS產品??JORAM的使用說明html

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接口類圖java

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 TopicSubscriberweb



ConnectionFactory :鏈接工廠,JMS 用它建立鏈接
Connection :JMS 客戶端到JMS Provider 的鏈接
Destination :消息的目的地
Session: 一個發送或接收消息的線程
MessageProducer: 由Session 對象建立的用來發送消息的對象
MessageConsumer: 由Session 對象建立的用來接收消息的對象express

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 Providerwindows


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);session

下例演示接收消息並轉換爲合適的消息類型:
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。能夠用QueueReceiver 或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是一個很是活躍的開源中間件團體。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

公告
最新評論
總結: object到object[]要進行拆箱轉換 object[]能夠直接裝箱成object (採雲摘月)
仍是在後臺代碼中解決的!不過用JS方法解決不了,就是不爽!!!鬱悶中 (採雲摘月)
沒有人遇到這類問題的嗎?真背 (採雲摘月)
謝謝了 (Dim.22)
想起一條笑話:我家電腦壞了,來了一個朋友,看了看後,說,你家有針麼?我說有。而後半天時間就看到他用針在光盤上點點戳戳。而後電腦修好了。後來我才知道,他刻錄了一張系統盤…… (梅樺)

引文來源   JMS : Java Message Service (Java消息服務)之一 - 採雲摘月 - 博客園
相關文章
相關標籤/搜索