cht台灣個人Log4Q
adm Find login register

The JMS API Programming Model

qrtt1

joined: 2007-10-02
posted: 82
promoted: 18
bookmarked: 5
藍星
1subject: The JMS API Programming ModelPromote 0 Bookmark 02008-06-03quote  
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 是必需要有的。

qrtt1

joined: 2007-10-02
posted: 82
promoted: 18
bookmarked: 5
藍星
2subject: Promote 0 Bookmark 02008-08-04quote  

Orz 在 google 找範例,怎麼找到自己的筆記 ><

cht台灣個人Log4Q
adm Find login register
views:7089