細(xì)心!用心!耐心!

          吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點(diǎn)粗墨,七八筆買賣,九十道人情。

          BlogJava 聯(lián)系 聚合 管理
            1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks

          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

          企業(yè)消息傳遞框架被設(shè)計(jì)用于使得一個(gè)或多個(gè)應(yīng)用能夠克服各種障礙進(jìn)行通信。常見的屏障包括:兩個(gè)系統(tǒng)同時(shí)運(yùn)行(同步通信)的需求,多個(gè)應(yīng)用獲取同一條消息(多重傳輸)的需求,大多數(shù)系統(tǒng)都彼此異構(gòu),以及網(wǎng)絡(luò)故障等。

          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ù)

          MOM 服務(wù)器允許不同類型的系統(tǒng)交換消息,但是每個(gè)MOM供應(yīng)商都有其特有的處理消息的API。這種標(biāo)準(zhǔn)化的缺乏對(duì)于Java技術(shù)開發(fā)范例來說是不可接受的。為了充分利用已有的MOM基礎(chǔ)設(shè)施,同時(shí)又不失標(biāo)準(zhǔn)化,J2EE平臺(tái)提供了JMS。

          Java 標(biāo)準(zhǔn)化
          為了提供平臺(tái)無關(guān)的和供應(yīng)商無關(guān)的解決方案,所有Java技術(shù)都可以分成兩個(gè)部分:

          1. 一份(或一套)定義該項(xiàng)技術(shù)的 規(guī)范說明書,指出了開發(fā)者和實(shí)現(xiàn)該技術(shù)的工具供應(yīng)商的目標(biāo)和責(zé)任。
          2. 一套中立接口,作為應(yīng)用開發(fā)者與工具供應(yīng)商之間的契約。

          不管您使用的是何種Java技術(shù),您首先要編寫使用了技術(shù)規(guī)范中提供的接口的應(yīng)用組件,然后在運(yùn)行時(shí)提供某一特定供應(yīng)商對(duì)這些接口的實(shí)現(xiàn)。在J2EE中,企業(yè)消息傳遞的規(guī)范和API是JMS。

           

          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 支持兩種基本的消息傳遞機(jī)制。第一種機(jī)制是點(diǎn)到點(diǎn)的消息傳遞(point-to-point messaging),在這種機(jī)制下,消息由一個(gè)發(fā)布者(發(fā)送方)發(fā)送,由訂閱者(接收方)接收。另一種機(jī)制是發(fā)布-訂閱式的消息傳遞(publish- subscribe messaging),在這種機(jī)制下,消息由一個(gè)或多個(gè)發(fā)布者發(fā)送,由一個(gè)或多個(gè)訂閱者接收。盡管這兩種機(jī)制是JMS的實(shí)際基礎(chǔ),很多人還是按照三種消息傳遞模型來看待這項(xiàng)技術(shù):

          • 一對(duì)一的消息傳遞(One-to-one messaging )是一種點(diǎn)到點(diǎn)的模型。消息由一個(gè)JMS客戶機(jī)(發(fā)布者)發(fā)送到服務(wù)器上的一個(gè)目的地,即一個(gè)隊(duì)列(queue)。而另一個(gè)JMS客戶機(jī)(訂閱者)則可以訪問這個(gè)隊(duì)列,并從該服務(wù)器獲取這條消息。在隊(duì)列中可以存放多條消息,但每次只能獲取一條消息。
          • 一對(duì)多的消息傳遞(One-to-many messaging)是一種發(fā)布-訂閱模型。這里仍然是由一個(gè)JMS客戶機(jī)將一條消息發(fā)布到服務(wù)器上的一個(gè)目的地上,但是這次這個(gè)目的地叫做一個(gè)主題(topic)。這里關(guān)鍵的不同在于放在一個(gè)主題中的消息包括了一個(gè)參數(shù),這個(gè)參數(shù)定義了該消息的耐久性(它能夠在服務(wù)器上等待訂閱者多長時(shí)間)。該消息將一直維持在主題中,直到這個(gè)主題的所有訂閱者都取走了該消息的一個(gè)副本,或者該消息的耐久性時(shí)間已到期,不管發(fā)生的是上述中的哪種情況,該消息都將被從這個(gè)主題中刪除。
          • 多對(duì)多的消息傳遞(Many-to-many messaging),這也是一種發(fā)布-訂閱模型,同時(shí)還擴(kuò)展了一對(duì)多的消息傳遞模型。除了支持多個(gè)訂閱者外,該模型還支持一個(gè)主題有多個(gè)發(fā)布者。多對(duì)多消息傳遞的一個(gè)很好的例子就是e-mail listserve:多個(gè)發(fā)布者可以將多條消息投遞到一個(gè)主題,而所有的訂閱者將獲取每一條消息。

          JMS消息的結(jié)構(gòu)相當(dāng)直觀。其中有一個(gè)部分(section)用于路由、尋址和消息識(shí)別;還有一個(gè)可選的部分,在這個(gè)部分中可以傳遞一些特定于應(yīng)用(application-specific)的參數(shù);第三個(gè) 部分存放的是消息的有效負(fù)荷(文本 、字節(jié)、值映射(value map)、對(duì)象,等等)。這三個(gè)部分分別被稱為頭部、屬性和主體,如圖 1 所示。

          圖 1. JMS 消息結(jié)構(gòu)
          JMS message structure

          您所使用的消息傳遞模型的類型取決于您企業(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是與Java 2 Enterprise Edition一起發(fā)布的一種企業(yè)級(jí)的技術(shù),您仍可以輕松地將一個(gè)標(biāo)準(zhǔn)Java客戶機(jī)轉(zhuǎn)換成一個(gè)支持JMS的應(yīng)用。將企業(yè)消息傳遞功能添加到Java applet、命令行應(yīng)用程序、Swing應(yīng)用程序或者Java WebStart都非常簡單。您只需簡單地將少量方法調(diào)用添加到J2SE應(yīng)用代碼中,然后將一個(gè)包含了JNDI(也是J2EE的一部分)的接口和實(shí)現(xiàn)類的JAR文件添加到類路徑(classpath)中。如果您已經(jīng)在客戶機(jī)上裝載了這個(gè)JAR文件,并且將它添加到了您的應(yīng)用的類路徑中,那么您就可以使用JNDI來訪問JMS提供者(參見下面的參考資料 ,以獲得關(guān)于JMS消息傳遞的更多信息的鏈接)。

          簡單JMS 客戶機(jī)的優(yōu)點(diǎn)和缺點(diǎn)
          簡單JMS 客戶機(jī)方法有許多優(yōu)點(diǎn),最明顯的優(yōu)點(diǎn)就是它的簡單性和普遍性。所有的J2SE應(yīng)用都可以毫不費(fèi)力地?cái)U(kuò)展為可以與一個(gè)JMS消息傳遞系統(tǒng)進(jìn)行交互。此外,使用JMS的新應(yīng)用部署起來只需對(duì)客戶端進(jìn)行少量的配置,甚至不需要配置。簡單JMS客戶機(jī)是對(duì)幾乎任何Java體系結(jié)構(gòu)的簡單、靈活和輕量級(jí)的一個(gè)擴(kuò)展。

          從消極的方面來看,我們會(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
          將會(huì)話bean與JMS結(jié)合起來使用是一種可行的面向企業(yè)的解決方案。會(huì)話bean被設(shè)計(jì)用來履行對(duì)業(yè)務(wù)服務(wù)的請求。必須查詢企業(yè)消息傳遞系統(tǒng)來履行這樣的一個(gè)請求,就這一點(diǎn)來說,企業(yè)消息傳遞系統(tǒng)可以由一個(gè)會(huì)話bean透明地來訪問。使用會(huì)話bean作為JMS客戶機(jī)還允許將JMS通信合并到一個(gè)大型企業(yè)事務(wù)的上下文環(huán)境中。例如,可以建立一個(gè)J2EE事務(wù)來從一個(gè)JMS提供者那里獲取一條消息,從該消息中提取數(shù)據(jù),并嘗試更新數(shù)據(jù)庫。如果更新操作失敗并且事務(wù)回滾 (rollback),則再發(fā)送一條消息到一個(gè)單獨(dú)的目的地上的JMS提供者那里,同時(shí)給出對(duì)事務(wù)失敗的原因的描述。

          企業(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)
          將JMS和會(huì)話bean結(jié)合起來使用,這在企業(yè)功能性方面是一個(gè)進(jìn)步,而在簡單性和靈活性方面卻又是一個(gè)退步。通過使用會(huì)話bean,應(yīng)用開發(fā)者可以訪問 EJB容器所提供的整個(gè)范圍的J2EE功能,包括JNDI、宣告式事務(wù)語義、自動(dòng)并發(fā)支持、資源管理、宣告式安全性以及對(duì)諸如實(shí)體bean、數(shù)據(jù)源、 JavaMail和JCA適配器之類的企業(yè)資源的訪問。從消息傳遞的立場來看(跟MDB不一樣),會(huì)話bean與JMS的聯(lián)手并沒有對(duì)您的bean所能訪問的主題和隊(duì)列強(qiáng)加任何數(shù)量上的限制。

          作為增強(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
          EJB 2.0 規(guī)范定義了一種新的企業(yè)bean,以期彌補(bǔ)其他四種類型的企業(yè)bean(兩種會(huì)話bean和兩種實(shí)體bean)的不足。這種新的bean就是消息驅(qū)動(dòng)bean(message-driven bean,MDB),人們期望用它來提供可重用的消息傳遞組件,以便利用已有的在J2EE應(yīng)用服務(wù)器方面的投資,尤其是利用已有的EJB技術(shù)。

          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)
          MDB允許開發(fā)者利用已有的在EJB技術(shù)方面的投資,但是仍然可以將這些投資整合到一個(gè)異步消息傳遞的上下文環(huán)境中。例如,JMS客戶機(jī)可以發(fā)送一條消息給一個(gè)MDB(該MDB一直在線等待傳進(jìn)來的消息),而后者可以訪問一個(gè)會(huì)話bean或者一些實(shí)體bean。通過這種方式,MDB可以被用作一種異步包裝器,提供對(duì)業(yè)務(wù)流程的訪問途徑,而之前這些業(yè)務(wù)流程只能通過一個(gè)同步的RMI/IIOP調(diào)用來訪問。

          消息驅(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)方針
          如前所述,選擇適當(dāng)?shù)慕鉀Q方案時(shí),大部分要做的工作就是衡量您企業(yè)的特定需求,包括目前的需求和可預(yù)見的將來的需求。如果能記住多種企業(yè)消息傳遞解決方案可以結(jié)合使用,那么也會(huì)很有幫助。在下一節(jié),我們將看一些常見的消息傳遞場景和每個(gè)場景潛在的JMS解決方案。當(dāng)您為您的企業(yè)選擇適當(dāng)?shù)南鬟f技術(shù),或者混合使用多種技術(shù)時(shí),這些內(nèi)容可以 提供一般的指導(dǎo)方針。

          從一個(gè)組件訪問多個(gè)主題和隊(duì)列
          如果您的業(yè)務(wù)流程規(guī)定了消息目的地只能有條件地訪問(換句話說,如果x<5,則訪問主題A,如果x>5,則訪問主題B),那么您將不能使用 MDB。不過,您可以使用一個(gè)簡單JMS客戶機(jī),或者將會(huì)話bean與JMS結(jié)合起來使用。為了在這兩種選擇之間作出決定,您必須在簡單JMS客戶機(jī)的輕量級(jí)特性(特別適合于applet、Swing應(yīng)用程序和獨(dú)立的控制臺(tái)應(yīng)用程序)以及J2EE容器的健壯性(包括透明的事務(wù)性支持、宣告式安全性和其他EJB型資源管理功能)之間進(jìn)行權(quán)衡。

          異步地訪問會(huì)話bean和實(shí)體bean
          有兩種方式來處理這一場景。比較明顯的一種方式就是使用一個(gè)消息驅(qū)動(dòng)bean,但前提是您的供應(yīng)商支持MDB技術(shù)。MDB被設(shè)計(jì)用來消費(fèi)異步消息并代表消息發(fā)送方訪問企業(yè)功能性。此外,應(yīng)用服務(wù)器可以維護(hù)一個(gè)MDB的多個(gè)實(shí)例,來處理并發(fā)的服務(wù)請求。如果您不能使用MDB,您可以創(chuàng)建一個(gè)簡單JMS客戶機(jī),以此來作為一個(gè)偵聽器。當(dāng)收到一條消息時(shí),該客戶機(jī)便可以與應(yīng)用服務(wù)器建立一個(gè)同步的RMI連接,并按照常規(guī)的方式調(diào)用會(huì)話bean或者實(shí)體bean。不過,MDB是更值得推薦的解決方案。

          構(gòu)建盡可能瘦的JMS客戶機(jī)
          在這一方面,簡單JMS客戶機(jī)顯然是贏家。如果對(duì)您來說更重要的是提供一個(gè)輕量級(jí)的消息傳遞客戶機(jī),而不是擁有像會(huì)話bean這樣的J2EE客戶機(jī)的可伸縮性和健壯性,那么簡單JMS是 正確的選擇。無論是會(huì)話bean與JMS的組合,還是MDB,兩者都需要一個(gè)J2EE應(yīng)用服務(wù)器,這使得兩種選擇都不適合瘦客戶機(jī)實(shí)現(xiàn)。

          并發(fā)地發(fā)送和接收消息
          這里惟一合適的選擇是使用消息驅(qū)動(dòng)bean。消息驅(qū)動(dòng)bean是專門為這一場景量身定做的。從技術(shù)上講,簡單JMS客戶機(jī)也可以利用多線程技術(shù)來提供類似的支持,但這種解決方案開發(fā)起來很復(fù)雜,并且最后開發(fā)出來的東西并沒有很好的可伸縮性。

          將消息傳遞合并到J2EE過程中
          您或許已經(jīng)在J2EE體系結(jié)構(gòu)中有所投入,并且認(rèn)識(shí)到將企業(yè)消息傳遞合并到這些J2EE過程中的需要。在大多數(shù)情況下,您最好的解決方案是將會(huì)話bean 與JMS資源連接結(jié)合起來使用。您可以采用已有的會(huì)話bean來訪問一個(gè)或多個(gè)主題和隊(duì)列,而不必重建整個(gè)基礎(chǔ)設(shè)施。這些會(huì)話bean將繼續(xù)履行傳統(tǒng)的對(duì)業(yè)務(wù)服務(wù)的請求,并且還 擔(dān)負(fù)起了消息傳遞的任務(wù)。在某些情況下,將您已有的業(yè)務(wù)服務(wù)暴露給一個(gè)JMS客戶機(jī)是有好處的,這從前面的討論中也可以發(fā)現(xiàn)。

          結(jié)束語
          就今天技術(shù)前景的多樣性和日趨于異步的特點(diǎn)來說,消息傳遞是一種激動(dòng)人心的、日益流行的解決方案。Java 消息服務(wù)提供了一種獨(dú)立于供應(yīng)商和平臺(tái)的媒介,通過使用企業(yè)消息傳遞將多個(gè)系統(tǒng)系在一起。在本文中,我們簡要地瀏覽了企業(yè)消息傳遞和JMS,并且給出了一些指導(dǎo)方針,以方便您選擇最適合您企業(yè)的解決方案。

          posted on 2007-05-06 11:56 張金鵬 閱讀(158) 評(píng)論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 新乐市| 南汇区| 鄂尔多斯市| 黎川县| 石河子市| 锡林浩特市| 琼中| 平潭县| 鱼台县| 辽阳市| 肥乡县| 平罗县| 蒙阴县| 太仓市| 长子县| 北流市| 济阳县| 静宁县| 英山县| 三都| 江阴市| 阳春市| 扎鲁特旗| 曲沃县| 丰城市| 汉源县| 张家口市| 东阿县| 德保县| 临湘市| 蓝田县| 南投市| 阳城县| 大同市| 略阳县| 博湖县| 南部县| 中方县| 大丰市| 纳雍县| 五华县|