Java消息服務基礎
在不同系統之間交換信息的一大障礙是如何在精確交換和格式化數據方面取得一致。Java Message Service( Java消息服務,簡稱JMS)通過提供一種與J2EE應用程序或傳統系統交互的方法部分的解決了這個問題。
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將自動地確認收到一則消息。