| ||||||||
adm | Find | login register |
The JMS API Programming Model
JMS API 使用的 workflow fig. http://java.sun.com/j2ee/1.4/docs/tutorial/doc/images/jms-programmingModel.gif 1. 使用 Connection Factory 建立 Connection 2. 使用 Connection 建立 Session 3. 使用 Session 建立 Producer 或 Consumer (不管是 Queue 或 Pub/Sub 模式都一樣) 4.1 由 Producer 傳送訊息給 Destination 4.2 Consumer 由 Destionation 接收訊息 ============================================== JMS API 有二種特殊的物件稱為 Administratered Object *. destinations *. connection factories ConnectionFactory 物件 connection factory 將 administrator 預先設定的連線組態設定封裝起來。每 connection factory 可以是下列三種介 面的實例 (instance):ConnectionFactory, QueueConnectionFactory, TopicConnectionFactory。 (Q: 要如何利用 ActiveMQ 的 administrator 建立 connection factory !?) 在 JMS client 程式,通常會先以 JNDI 查詢 connection factory 資源,再強制轉型為 ConnectionFactory 物件。相關 的程式片段可能像是: Context ctx = new InitialContext(); ConnectionFactory connectionFactory = (ConnectionFactory) ctx.lookup("jms/ConnectionFactory"); Destination 物件 destination 代表一個 client 所指定的目的地。以 Producer 來說,它會是訊息被送往的目標;以 Consumer 來說它 會是消耗訊息的來源。在 PTP messaging domain,destination 就稱為 Queue;在 pub/sub messaging domain, destination 被稱為 topics。 以 application server 來說,建立 desination 分為二部。 一、向 jndi 登記 destination 資源的名稱 二、建立一個實體的位置指向 destination 資源的名稱 (Q: 如何在 ActiveMQ 完成這些事情呢?) JMS 應用程式能使用多個 Queue 或 Topics。 除了透過 JNDI 查出 ConnectoinFactory,通常也需要查詢 destination。但是 destination 並不是通用的,因為以 Queue Messaging Domain 您需要使用 Queue 介面的 destination;同樣在 Pub/Sub Messaging Domain 您需要使用 Topic 介面的 destination,它們都繼承自 destionation。您可以依適當的 Messaging Domain 強制轉型: Destination myDest = (Destination) ctx.lookup("jms/MyTopic"); Queue myQueue = (Queue) ctx.lookup("jms/MyQueue"); Connection物件 Connection物件將 client 至 JMS Provider 間的 TCP/IP socket 連線實作封裝起來。您可以使用連線建立一個或多個 Session。您可以使用下列的方式建立連線: Connection connection = connectionFactory.createConnection(); 當程式完成工作後,您應該確實地關閉連線: connection.close(); 如果沒有使連線正常地關閉,那可能導致 JMS provider 佔用的資源沒有被釋放。關閉連線的同時也會關閉 Session 與相對應的 Producer 和 Consumer。 在開始所有的消耗訊息動作之前,您應該先向 connectoin 呼叫 start 方法,如果您需要暫停訊息傳送那可以呼叫 stop 方法,這個動作不會讓連線終止。 Session 物件 Session是單執行緒的背景物件,能用來產生/消耗息訊。您使用 Session 來建立 Producer/Consumer 與 Message。 Session 會依序執行 Message Listener。(Session 也能啟動交易式的傳訊模式)。 // 第一個參數是指不使用交易模式 // 第二個參數是說,當訊息被成功地接收時自動回覆成功訊號 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 如果要建立交易式的 Session 就要使用下列寫法: Session session = connection.createSession(true, 0); ============================================================== Message Producers message producer 是用來產生訊息的物件,它實作 MessageProducer 介面。使用 Session 建立 MessageProducer 物 件時,需要給它 destination: MessageProducer producer = session.createProducer(myQueue); MessageProducer producer = session.createProducer(myTopic); 如果您在建立 MessageProducer 時,destionation 參數設定為 null。就表示您將在每一次傳訊息時額外指定: MessageProducer anon_prod = session.createProducer(null); anon_prod.send(myQueue, message); Message Consumers (MessageConsumer 的用法同上) MessageConsumer consumer = session.createConsumer(myQueue); MessageConsumer consumer = session.createConsumer(myTopic); 但針對 topics 來說,它還能特別建立 DurableSubscriber (目前用不到這方面的知識) 對 MessageConsumer 來說,接收訊息是需要對 connection 呼叫 start 方法的。並且對 MessageConsumer 呼叫 receiver 方法獲得訊息: connection.start(); Message m = consumer.receive(); connection.start(); Message m = consumer.receive(1000); // time out after a second 這是同步模式的 MessageConsumer。如果您想要非同步地處理訊息,那麼應該使用 Message Listener。 Message Listeners 在 JMS 的聆聽者就像一般 GUI 程式所使用的事件處理器。您在 Consumer 新增 Listener 就像您替 UI Component 新增 Listener 一樣: Listener myListener = new Listener(); consumer.setMessageListener(myListener); 在 MessageListener 介面,只有唯一的方法 onMessage。您會在 onMessage 內取得 Message 物件,並適當地處理 它。(您應該在註冊 Listener 後才向 Connection 發送 start 的訊息,否則您可能會遺部分的 Message) 。您應該在 onMessage 內處理所有的例外,即使是 RuntimeException 也是不容許發生的。 Message Selectors 如果你的程式在實作接收訊息時,有過濾的需求,您應該使用 message selector,它能幫您過濾訊息只留下您感 興趣的部分。 Message JMS 應用程式的最終目標是產生/消耗任何其他非 JMS 應用程式傳來訊息。JMS 訊息有個基本的格式,它簡單 卻又擁有高度的彈性。這樣的設計讓您能輕易地由非 JMS 應用程式或異質的平台建立訊息。 JMS 訊息有三個部分: header、prodperites、body。這三個部分只有 header 是必需要有的。 | |||||||||||
|
| ||||||||
adm | Find | login register |