J2EE探索者:用JMS進行企業消息傳遞 |
|
Java 開發者和咨詢顧問Kyle Gabhart 解釋了為什么消息服務對于企業的體系結構來說是至關重要的,您的解決方案必須克服什么類型的障礙,以及 除了Java消息服務(Java Message Service ,JMS)之外,還有哪些替代的解決方案。在本文的結尾,他分析了三種可用的解決方案(簡單JMS客戶機(Simple JMS Client)、結合JMS使用的會話bean, 以及消息驅動bean),并且提供了一些特定的指導方針來衡量這些選項。
說到對消息傳遞解決方案的選擇,您可以像配手套那樣找到適合于企業的解決方案。您的消息傳遞框架必須能夠在一組應用和企業資源之間進行通信。而且,該消息傳遞框架必須快速、可靠地完成這一任務。此外,面對日復一日的騷擾和緊急情況,它必須表現得天衣無縫。 為了根據您的需求選擇適當的消息傳遞解決方案,首先應該對您企業當前的組成結構以及將來的發展趨勢有一個清醒的認識。此外,如果能夠透徹地理解消息傳遞框架在完成目標的過程中必須克服的障礙,那么對于解決方案的選擇將會很有幫助。最后,您要知道 可選擇的范圍:有哪些可用的技術,以及各種技術對于不同的環境和需求的適用情況如何。 在本期的J2EE 探索者中,我們將一一闡述以上要點。首先是對企業消息傳遞的概述,在此我們將著眼于消息傳遞在您企業中所扮演的角色,并在建立可靠的通信方面給出了一些挑戰。接著,我們將從體系結構的角度來快速 了解一下,在一個典型的企業網絡環境中,J2EE 消息傳遞技術如何與面向消息的中間件協同工作。然后,我們將針對Java消息服務(Java Message Service ,JMS)和J2EE的消息傳遞包展開更具體的討論。我們將分別論述三種類型的J2EE消息傳遞客戶機的基本目標和功能,而且您也可以了解到每種類型的 J2EE消息傳遞客戶機各自的優勢和劣勢所在。最后,我們將分析一些常見的消息傳遞場景和解決方案,這將有助于您為您的企業選擇最好的J2EE消息傳遞解決方案。 企業消息傳遞101 M許多企業的體系結構依賴于面向消息的中間件系統(MOM)來為不同類型的系統提供消息通道。MOM為應用提供了一種公共的、可靠的方式,使這些應用能夠輕松地創建、交換和處理消息,而無需考慮消息傳遞客戶機的實現細節。消息被發送到服務器目的地和域 (domain),而不是發送到物理地址。消息傳遞客戶機只需簡單地聲明對某個特定的域和目的地感興趣,提供適當的安全性令牌(security token)以獲得訪問該域的權限,然后通過那個目的地與消息傳遞服務器進行交互。 從概念上來講,這與現實生活中真實郵件的傳遞方式沒什么不同。消息的發送方只負責使用正確的包裝,提供正確的地址,并附上適當的郵資。 郵局(這里是一個MOM系統)處理 與消息的安全可靠的傳遞相關的所有問題,而不 管出現在他們面前的任何障礙(機器故障,天氣惡劣,等等)。 在一個MOM系統中,客戶機之間的耦合性比較弱,這允許它們不必真正地全天“在線”便能維持服務的最佳質量。如果能夠去掉應用一直處于可用狀態這一需求,那么維護和伸縮性將變得更加易于管理??梢栽谝惶熘械娜魏螘r候將應用離線,更新應用,或者作為例行的維護工作刷新應用,而不必擔心會影響服務的質量。 Java 消息服務
JMS 定義了在Java企業系統中傳遞消息的規則,并且聲明了一些方便應用組件和消息傳遞系統(通常是MOM)之間的消息交換的接口。JMS客戶機向MOM服務器上的目的地開放連接,然后在那個目的地上發送和接收消息。JMS卸下了 保證傳送(guaranteed delivery)、消息通知(message notification)、消息耐久性(message durability)以及消息傳遞系統中所有底層網絡和路由問題的負擔。JMS和MOM能夠很好地協同工作,因為它們都劃清了消息傳遞客戶機和服務器之間的責任界限。 消息傳遞的類型
JMS消息的結構相當直觀。其中有一個部分(section)用于路由、尋址和消息識別;還有一個可選的部分,在這個部分中可以傳遞一些特定于應用(application-specific)的參數;第三個 部分存放的是消息的有效負荷(文本 、字節、值映射(value map)、對象,等等)。這三個部分分別被稱為頭部、屬性和主體,如圖 1 所示。 您所使用的消息傳遞模型的類型取決于您企業的需要。在一個企業中同時使用不止一個的消息傳遞策略并不少見。在后面的一些小節中,我們將研究一下用于Java 平臺的三種JMS解決方案:簡單JMS客戶機,結合JMS使用的會話bean,以及消息驅動bean。我們將重新回顧每種類型,它們各自的優點和缺點,以及它們對不同企業場景的適用情況。 簡單JMS客戶機 簡單JMS 客戶機的優點和缺點 從消極的方面來看,我們會遇到安全性、事務處理以及可伸縮性等問題。對于一個簡單JMS客戶機,您只能選擇將安全性和事務處理外包給某個供應商,也就是說,這些問題將是以一種特定于供應商的方式來處理的。如果您的簡單JMS客戶機既要處理傳進來的消息,又要發送消息,那么就會碰到可伸縮性問題。JMS沒有能夠一次處理多于一個傳進來的請求的內建機制。為了支持并發請求,您需要擴展JMS客戶機,使其產生多個線程,或者啟動多個JVM實例,讓這些線程或實例各自運行應用。此外,還需要將JMS提供者配置為在一些適當的目的地上可以有多個訂閱者。這時,您(或者您的開發小組)就會質疑簡單JMS客戶機解決方案是否真的具有簡單性。 會話bean與JMS 企業JavaBeans 技術使用資源管理器連接工廠來訪問額外容器(extra-container )資源。這些資源是標準的企業組件,但不是J2EE容器的核心部分,它們包括數據源、JMS會話、JavaMail會話、URL連接以及Java連接器體系結構( Java Connector Architecture ,JCA)適配器。資源管理器是J2EE容器的一個組件,它管理著某一特定類型的資源的整個生命周期,這些資源包括連接池、事務支持以及實現實際連接所必需的任何網絡協議。 企業bean通過三個步驟來獲得一個JMS會話的連接:通過JNDI查找獲得一個連接工廠引用,通過工廠引用獲得一個連接,然后以一種常規的JMS的方式使用主題或者隊列連接對象。因為JMS必須有遵從J2EE規范的應用服務器的支持,因此不再需要附加的庫或者組件。 JMS會話bean 的優點和缺點 作為增強企業特性的代價,您犧牲了簡單性,客戶機占用空間(client footprint)也不再像以前那么小了,而且也沒有了異步性。前兩項損失倒沒什么好奇怪的,如果您已經關注探索者 系列有一段時間了,那么您就更能理解這一點。會話bean要求有一個成熟的J2EE EJB容器,這讓您的開發小組(針對EJB開發而言)和您的整個系統體系結構(針對客戶機占用空間而言)背上了沉重的包袱。 異步性是使用像JMS這樣的企業消息傳遞技術的主要優勢之一,而且,在取得這一優勢的同時它并沒有失去什么。有了JMS,消息傳遞客戶機可以通過提供者發送消息,消息發送出去之后便可以離線,而讓提供者從容地傳送這條消息。接收消息的客戶機可以周期性地上線并檢查新的消息,或者也可以設立一個偵聽器組件,令其一直處于在線狀態以等待來自提供者的消息。會話bean是同步的,因而不能支持“一直在線(always-on)”偵聽器組件。與前一種客戶機不同,同步的Java客戶機必須調用一個會話bean方法。然后由該會話bean方法打開與一個消息傳遞提供者的連接,以便發送和接收消息。 消息驅動bean MDB 只能通過一條JMS消息異步地進行調用。因此,它并不具有其他bean所具有的本地和遠程接口。相反,MDB實現兩種特殊的接口:一個與EJB容器之間的接口(javax.ejb.MessageDrivenBean),以及一個消息傳遞接口(javax.jms.MessageListener)。作為一種成熟的JMS客戶機,MDB通過一個MOM服務器既可以發送消息,又可以接收消息。作為一種企業bean,MDB由容器來管理,并且通過一個EJB部署描述符進行宣告式的配置。 MDB 的優點和缺點 消息驅動bean本身也是一種強大的消息傳遞解決方案。由于MDB被專門設計用來作為消息的消費者,并且仍然是由EJB容器管理的,因此它們在可伸縮性方面提供了巨大的優勢。由于消息bean是無狀態的,并且由容器進行管理,因此它們并發地發送和接收消息(容器只是簡單地將另一個bean從池中提出)。這一點,加上EJB應用服務器所固有的可伸縮性,構成了一種極其健壯的、可伸縮的企業消息傳遞解決方案。 另一方面,MDB相對來說還是一種很新鮮的事物,沒有經過很多的檢驗。因而,并不是所有的J2EE供應商都支持它們,即使是支持MDB的那些供應商也只是最近才實現它們的??梢灶A見,MDB的不成熟意味著 供應商實現在穩定性和可靠性方面還有一段很長的路要走。而且,MDB社區也需要經歷更多的錘煉,以獲得一套成形的使用MDB的最佳實踐。 拋開MDB的相對不成熟性不提,理解它是為專門的目的而設計的(即作為JMS消息的消費者)十分重要。MDB只能通過JMS消息來調用,其他方式都不管用。這意味著它們作為消息的消費者非常理想,但未必適合作為消息的生產者。消息驅動bean當然可以發送消息,但前提是它首先要讓一條傳進來的請求調用它。而且,當前設計的MDB只能映射到單個的目的地。它們只能在那個目的地上偵聽消息。這一限制在以后的版本中可以改變,但目前您只能為每個您想偵聽的目的地定義一個MDB。 消息傳遞解決方案指導方針 從一個組件訪問多個主題和隊列 異步地訪問會話bean和實體bean 構建盡可能瘦的JMS客戶機 并發地發送和接收消息 將消息傳遞合并到J2EE過程中 結束語 |