在不同系統之間交換信息的一大障礙是如何在精確交換和格式化數據方面取得一致。Java Message Service( Java消息服務,簡稱JMS)通過提供一種與J2EE應用程序或傳統系統交互的方法部分的解決了這個問題。
<!-- frame contents -->
<!-- /frame contents -->
JMS的通用接口集合以異步方式發送或接收消息。異步方式接收消息顯然是使用間斷網絡連接的客戶機,諸如移動電話和PDA的最好的選擇。另外, JMS采用一種寬松結合方式整合企業系統的方法,其主要的目的就是創建能夠使用跨平台數據信息的、可移植的企業級應用程序,而把開發人力解放出來。
Java消息服務支持兩種消息模型:Point-to-Point消息(P2P)和發布訂閱消息(Publish Subscribe messaging,簡稱Pub/Sub)。JMS規范並不要求供給商同時支持這兩種消息模型,但開發者應該熟悉這兩種消息模型的優勢與缺點。
P2P消息模型是在點對點之間傳遞消息時使用。假如應用程序開發者希望每一條消息都能夠被處理,那麼應該使用P2P消息模型。與Pub/Sub消息模型不同,P2P消息總是能夠被傳送到指定的位置。
Pub/Sub模型在一到多的消息廣播時使用。假如一定程度的消息傳遞的不可靠性可以被接受的話,那麼應用程序開發者也可以使用Pub/Sub消息模型。換句話說,它適用於所有的消息消費程序並不要求能夠收到所有的信息或者消息消費程序並不想接收到任何消息的情況。
JMS通過答應創建持久訂閱來簡化時間相關性,即使消息預訂者未激活也可以接收到消息。此外,使用持久訂閱還可通過隊列提供靈活性和可靠性,而仍然答應消息被發給許多的接收者。
Topic Subscriber topic Subscriber =
topicSession.createDurableSubscriber(topic, subscriptionName);
Connection對象表示了到兩種消息模型中的任一種的消息系統的連接。服務器端和客戶機端對象要求治理創建的JMS連接的狀態。連接是由Connection Factory創建的並且通過JNDI查尋定位。
//取得用於 P2P的 QueueConnectionFactory
QueueConnectionFactory = queueConnectionFactory( );
Context messaging = new InitialContext( );
QueueConnectionFactory = (QueueConnectionFactory)
Messaging.lookup(“QueueConnectionFactory”);
//取得用於 pub/sub的 TopicConnectionFactory
TopicConnectonFactory topicConnectionFactory;
Context messaging = new InitialContext();
topicConnectionFactory = (TopicConnectionFactory)
messaging.lookup(“TopicConnectionFactory”);
注重:用於P2P的代碼和用於PublishSubscribe的代碼非常相似。
假如session被標記為transactional的話,確認消息就通過確認和校正來自動地處理。假如session沒有標記為 transactional,你有三個用於消息確認的選項。
· AUTO_ACKNOWLEDGE session將自動地確認收到一則消息。
· CLIENT_ACKNOWLEDGE 客戶端程序將確認收到一則消息,調用這則消息的確認方法。
· DUPS_OK_ACKNOWLEDGE 這個選項命令session“懶散的”確認消息傳遞,可以想到,這將導致消息提供者傳遞的一些復制消息可能會出錯。這種確認的方式只應當用於消息消費程序可以容忍潛在的副本消息存在的情況。
queueSession = queueConnection.createQueueSession(false, session.AUTO_ACKNOWLEDGE);//P2P
topicSession = topicConnection.createTopicSession(false, session.AUTO_ACKNOWLEDGE); //Pub-Sub
注重:在本例中,一個session目的從連結中創建,非值指出session是non-transactional的,並且 session將自動地確認收到一則消息。
JMS現在有兩種傳遞消息的方式。標記為NON_PERSISTENT的消息最多投遞一次,而標記為PERSISTENT的消息將使用暫存後再轉送的機理投遞。假如一個JMS服務離線,那麼持久性消息不會丟失但是得等到這個服務恢復聯機時才會被傳遞。所以默認的消息傳遞方式是非持久性的。即使使用非持久性消息可能降低內務和需要的存儲器,並且這種傳遞方式只有當你不需要接收所有的消息時才使用。
雖然 JMS規范並不需要JMS供給商實現消息的優先級路線,但是它需要遞送加快的消息優先於普通級別的消息。JMS定義了從0到9的優先級路線級別,0是最低的優先級而9則是最高的。更非凡的是0到4是正常優先級的變化幅度,而5到9是加快的優先級的變化幅度。舉例來說:
topicPublisher.publish (message, DeliveryMode.PERSISTENT, 8, 10000); //Pub-Sub
或
queueSender.send(message, DeliveryMode.PERSISTENT, 8, 10000);//P2P