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