在不同系統之間交換資訊的一大障礙是如何在精確交換和格式化資料方面取得一致。Java Message Service( JavaMessage Service,簡稱JMS)通過提供一種與J2EE應用程式或傳統系統互動的方法部分的解決了這個問題。
JMS的通用介面集合以非同步方式發送或接收訊息。非同步方式接收訊息顯然是使用間斷網路連接的客戶機,諸如行動電話和PDA的最好的選擇。另外, JMS採用一種寬鬆結合方式整合企業系統的方法,其主要的目的就是建立能夠使用跨平台資料資訊的、可移植的企業級應用程式,而把開發人力解放出來。
JavaMessage Service支援兩種訊息模型: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