Java 開(kāi)發(fā)者和咨詢顧問(wèn)Kyle Gabhart 解釋了為什么消息服務(wù)對(duì)于企業(yè)的體系結(jié)構(gòu)來(lái)說(shuō)是至關(guān)重要的,您的解決方案必須克服什么類型的障礙,以及 除了Java消息服務(wù)(Java Message Service ,JMS)之外,還有哪些替代的解決方案。在本文的結(jié)尾,他分析了三種可用的解決方案(簡(jiǎn)單JMS客戶機(jī)(Simple JMS Client)、結(jié)合JMS使用的會(huì)話bean, 以及消息驅(qū)動(dòng)bean),并且提供了一些特定的指導(dǎo)方針來(lái)衡量這些選項(xiàng)。
說(shuō)到對(duì)消息傳遞解決方案的選擇,您可以像配手套那樣找到適合于企業(yè)的解決方案。您的消息傳遞框架必須能夠在一組應(yīng)用和企業(yè)資源之間進(jìn)行通信。而且,該消息傳遞框架必須快速、可靠地完成這一任務(wù)。此外,面對(duì)日復(fù)一日的騷擾和緊急情況,它必須表現(xiàn)得天衣無(wú)縫。
為了根據(jù)您的需求選擇適當(dāng)?shù)南鬟f解決方案,首先應(yīng)該對(duì)您企業(yè)當(dāng)前的組成結(jié)構(gòu)以及將來(lái)的發(fā)展趨勢(shì)有一個(gè)清醒的認(rèn)識(shí)。此外,如果能夠透徹地理解消息傳遞框架在完成目標(biāo)的過(guò)程中必須克服的障礙,那么對(duì)于解決方案的選擇將會(huì)很有幫助。最后,您要知道 可選擇的范圍:有哪些可用的技術(shù),以及各種技術(shù)對(duì)于不同的環(huán)境和需求的適用情況如何。
在本期的J2EE 探索者中,我們將一一闡述以上要點(diǎn)。首先是對(duì)企業(yè)消息傳遞的概述,在此我們將著眼于消息傳遞在您企業(yè)中所扮演的角色,并在建立可靠的通信方面給出了一些挑戰(zhàn)。接著,我們將從體系結(jié)構(gòu)的角度來(lái)快速 了解一下,在一個(gè)典型的企業(yè)網(wǎng)絡(luò)環(huán)境中,J2EE 消息傳遞技術(shù)如何與面向消息的中間件協(xié)同工作。然后,我們將針對(duì)Java消息服務(wù)(Java Message Service ,JMS)和J2EE的消息傳遞包展開(kāi)更具體的討論。我們將分別論述三種類型的J2EE消息傳遞客戶機(jī)的基本目標(biāo)和功能,而且您也可以了解到每種類型的 J2EE消息傳遞客戶機(jī)各自的優(yōu)勢(shì)和劣勢(shì)所在。最后,我們將分析一些常見(jiàn)的消息傳遞場(chǎng)景和解決方案,這將有助于您為您的企業(yè)選擇最好的J2EE消息傳遞解決方案。
企業(yè)消息傳遞101
企業(yè)消息傳遞框架被設(shè)計(jì)用于使得一個(gè)或多個(gè)應(yīng)用能夠克服各種障礙進(jìn)行通信。常見(jià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)來(lái)為不同類型的系統(tǒng)提供消息通道。MOM為應(yīng)用提供了一種公共的、可靠的方式,使這些應(yīng)用能夠輕松地創(chuàng)建、交換和處理消息,而無(wú)需考慮消息傳遞客戶機(jī)的實(shí)現(xiàn)細(xì)節(jié)。消息被發(fā)送到服務(wù)器目的地和域 (domain),而不是發(fā)送到物理地址。消息傳遞客戶機(jī)只需簡(jiǎn)單地聲明對(duì)某個(gè)特定的域和目的地感興趣,提供適當(dāng)?shù)陌踩粤钆疲╯ecurity token)以獲得訪問(wèn)該域的權(quán)限,然后通過(guò)那個(gè)目的地與消息傳遞服務(wù)器進(jìn)行交互。
從概念上來(lái)講,這與現(xiàn)實(shí)生活中真實(shí)郵件的傳遞方式?jīng)]什么不同。消息的發(fā)送方只負(fù)責(zé)使用正確的包裝,提供正確的地址,并附上適當(dāng)?shù)泥]資。 郵局(這里是一個(gè)MOM系統(tǒng))處理 與消息的安全可靠的傳遞相關(guān)的所有問(wè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ù)開(kāi)發(fā)范例來(lái)說(shuō)是不可接受的。為了充分利用已有的MOM基礎(chǔ)設(shè)施,同時(shí)又不失標(biāo)準(zhǔn)化,J2EE平臺(tái)提供了JMS。
Java 標(biāo)準(zhǔn)化 為了提供平臺(tái)無(wú)關(guān)的和供應(yīng)商無(wú)關(guān)的解決方案,所有Java技術(shù)都可以分成兩個(gè)部分:
- 一份(或一套)定義該項(xiàng)技術(shù)的 規(guī)范說(shuō)明書(shū),指出了開(kāi)發(fā)者和實(shí)現(xiàn)該技術(shù)的工具供應(yīng)商的目標(biāo)和責(zé)任。
- 一套中立接口,作為應(yīng)用開(kāi)發(fā)者與工具供應(yīng)商之間的契約。
不管您使用的是何種Java技術(shù),您首先要編寫(xiě)使用了技術(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ù)器上的目的地開(kāi)放連接,然后在那個(gè)目的地上發(fā)送和接收消息。JMS卸下了 保證傳送(guaranteed delivery)、消息通知(message notification)、消息耐久性(message durability)以及消息傳遞系統(tǒng)中所有底層網(wǎng)絡(luò)和路由問(wèn)題的負(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ǔ),很多人還是按照三種消息傳遞模型來(lái)看待這項(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ī)(訂閱者)則可以訪問(wèn)這個(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ù)器上等待訂閱者多長(zhǎng)時(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)

您所使用的消息傳遞模型的類型取決于您企業(yè)的需要。在一個(gè)企業(yè)中同時(shí)使用不止一個(gè)的消息傳遞策略并不少見(jiàn)。在后面的一些小節(jié)中,我們將研究一下用于Java 平臺(tái)的三種JMS解決方案:簡(jiǎn)單JMS客戶機(jī),結(jié)合JMS使用的會(huì)話bean,以及消息驅(qū)動(dòng)bean。我們將重新回顧每種類型,它們各自的優(yōu)點(diǎn)和缺點(diǎn),以及它們對(duì)不同企業(yè)場(chǎng)景的適用情況。
簡(jiǎn)單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都非常簡(jiǎn)單。您只需簡(jiǎn)單地將少量方法調(diào)用添加到J2SE應(yīng)用代碼中,然后將一個(gè)包含了JNDI(也是J2EE的一部分)的接口和實(shí)現(xiàn)類的JAR文件添加到類路徑(classpath)中。如果您已經(jīng)在客戶機(jī)上裝載了這個(gè)JAR文件,并且將它添加到了您的應(yīng)用的類路徑中,那么您就可以使用JNDI來(lái)訪問(wèn)JMS提供者(參見(jiàn)下面的參考資料 ,以獲得關(guān)于JMS消息傳遞的更多信息的鏈接)。
簡(jiǎn)單JMS 客戶機(jī)的優(yōu)點(diǎn)和缺點(diǎn)
簡(jiǎn)單JMS 客戶機(jī)方法有許多優(yōu)點(diǎn),最明顯的優(yōu)點(diǎn)就是它的簡(jiǎn)單性和普遍性。所有的J2SE應(yīng)用都可以毫不費(fèi)力地?cái)U(kuò)展為可以與一個(gè)JMS消息傳遞系統(tǒng)進(jìn)行交互。此外,使用JMS的新應(yīng)用部署起來(lái)只需對(duì)客戶端進(jìn)行少量的配置,甚至不需要配置。簡(jiǎn)單JMS客戶機(jī)是對(duì)幾乎任何Java體系結(jié)構(gòu)的簡(jiǎn)單、靈活和輕量級(jí)的一個(gè)擴(kuò)展。
從消極的方面來(lái)看,我們會(huì)遇到安全性、事務(wù)處理以及可伸縮性等問(wèn)題。對(duì)于一個(gè)簡(jiǎn)單JMS客戶機(jī),您只能選擇將安全性和事務(wù)處理外包給某個(gè)供應(yīng)商,也就是說(shuō),這些問(wèn)題將是以一種特定于供應(yīng)商的方式來(lái)處理的。如果您的簡(jiǎn)單JMS客戶機(jī)既要處理傳進(jìn)來(lái)的消息,又要發(fā)送消息,那么就會(huì)碰到可伸縮性問(wèn)題。JMS沒(méi)有能夠一次處理多于一個(gè)傳進(jìn)來(lái)的請(qǐng)求的內(nèi)建機(jī)制。為了支持并發(fā)請(qǐng)求,您需要擴(kuò)展JMS客戶機(jī),使其產(chǎn)生多個(gè)線程,或者啟動(dòng)多個(gè)JVM實(shí)例,讓這些線程或?qū)嵗髯赃\(yùn)行應(yīng)用。此外,還需要將JMS提供者配置為在一些適當(dāng)?shù)哪康牡厣峡梢杂卸鄠€(gè)訂閱者。這時(shí),您(或者您的開(kāi)發(fā)小組)就會(huì)質(zhì)疑簡(jiǎn)單JMS客戶機(jī)解決方案是否真的具有簡(jiǎn)單性。
會(huì)話bean與JMS
將會(huì)話bean與JMS結(jié)合起來(lái)使用是一種可行的面向企業(yè)的解決方案。會(huì)話bean被設(shè)計(jì)用來(lái)履行對(duì)業(yè)務(wù)服務(wù)的請(qǐng)求。必須查詢企業(yè)消息傳遞系統(tǒng)來(lái)履行這樣的一個(gè)請(qǐng)求,就這一點(diǎn)來(lái)說(shuō),企業(yè)消息傳遞系統(tǒng)可以由一個(gè)會(huì)話bean透明地來(lái)訪問(wèn)。使用會(huì)話bean作為JMS客戶機(jī)還允許將JMS通信合并到一個(gè)大型企業(yè)事務(wù)的上下文環(huán)境中。例如,可以建立一個(gè)J2EE事務(wù)來(lái)從一個(gè)JMS提供者那里獲取一條消息,從該消息中提取數(shù)據(jù),并嘗試更新數(shù)據(jù)庫(kù)。如果更新操作失敗并且事務(wù)回滾 (rollback),則再發(fā)送一條消息到一個(gè)單獨(dú)的目的地上的JMS提供者那里,同時(shí)給出對(duì)事務(wù)失敗的原因的描述。
企業(yè)JavaBeans 技術(shù)使用資源管理器連接工廠來(lái)訪問(wèn)額外容器(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通過(guò)三個(gè)步驟來(lái)獲得一個(gè)JMS會(huì)話的連接:通過(guò)JNDI查找獲得一個(gè)連接工廠引用,通過(guò)工廠引用獲得一個(gè)連接,然后以一種常規(guī)的JMS的方式使用主題或者隊(duì)列連接對(duì)象。因?yàn)镴MS必須有遵從J2EE規(guī)范的應(yīng)用服務(wù)器的支持,因此不再需要附加的庫(kù)或者組件。
JMS會(huì)話bean 的優(yōu)點(diǎn)和缺點(diǎn)
將JMS和會(huì)話bean結(jié)合起來(lái)使用,這在企業(yè)功能性方面是一個(gè)進(jìn)步,而在簡(jiǎn)單性和靈活性方面卻又是一個(gè)退步。通過(guò)使用會(huì)話bean,應(yīng)用開(kāi)發(fā)者可以訪問(wèn) EJB容器所提供的整個(gè)范圍的J2EE功能,包括JNDI、宣告式事務(wù)語(yǔ)義、自動(dòng)并發(fā)支持、資源管理、宣告式安全性以及對(duì)諸如實(shí)體bean、數(shù)據(jù)源、 JavaMail和JCA適配器之類的企業(yè)資源的訪問(wèn)。從消息傳遞的立場(chǎng)來(lái)看(跟MDB不一樣),會(huì)話bean與JMS的聯(lián)手并沒(méi)有對(duì)您的bean所能訪問(wèn)的主題和隊(duì)列強(qiáng)加任何數(shù)量上的限制。
作為增強(qiáng)企業(yè)特性的代價(jià),您犧牲了簡(jiǎn)單性,客戶機(jī)占用空間(client footprint)也不再像以前那么小了,而且也沒(méi)有了異步性。前兩項(xiàng)損失倒沒(méi)什么好奇怪的,如果您已經(jīng)關(guān)注探索者 系列有一段時(shí)間了,那么您就更能理解這一點(diǎn)。會(huì)話bean要求有一個(gè)成熟的J2EE EJB容器,這讓您的開(kāi)發(fā)小組(針對(duì)EJB開(kāi)發(fā)而言)和您的整個(gè)系統(tǒng)體系結(jié)構(gòu)(針對(duì)客戶機(jī)占用空間而言)背上了沉重的包袱。
異步性是使用像JMS這樣的企業(yè)消息傳遞技術(shù)的主要優(yōu)勢(shì)之一,而且,在取得這一優(yōu)勢(shì)的同時(shí)它并沒(méi)有失去什么。有了JMS,消息傳遞客戶機(jī)可以通過(guò)提供者發(fā)送消息,消息發(fā)送出去之后便可以離線,而讓提供者從容地傳送這條消息。接收消息的客戶機(jī)可以周期性地上線并檢查新的消息,或者也可以設(shè)立一個(gè)偵聽(tīng)器組件,令其一直處于在線狀態(tài)以等待來(lái)自提供者的消息。會(huì)話bean是同步的,因而不能支持“一直在線(always-on)”偵聽(tīng)器組件。與前一種客戶機(jī)不同,同步的Java客戶機(jī)必須調(diào)用一個(gè)會(huì)話bean方法。然后由該會(huì)話bean方法打開(kāi)與一個(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),人們期望用它來(lái)提供可重用的消息傳遞組件,以便利用已有的在J2EE應(yīng)用服務(wù)器方面的投資,尤其是利用已有的EJB技術(shù)。
MDB 只能通過(guò)一條JMS消息異步地進(jìn)行調(diào)用。因此,它并不具有其他bean所具有的本地和遠(yuǎn)程接口。相反,MDB實(shí)現(xiàn)兩種特殊的接口:一個(gè)與EJB容器之間的接口(javax.ejb.MessageDrivenBean),以及一個(gè)消息傳遞接口(javax.jms.MessageListener)。作為一種成熟的JMS客戶機(jī),MDB通過(guò)一個(gè)MOM服務(wù)器既可以發(fā)送消息,又可以接收消息。作為一種企業(yè)bean,MDB由容器來(lái)管理,并且通過(guò)一個(gè)EJB部署描述符進(jìn)行宣告式的配置。
MDB 的優(yōu)點(diǎn)和缺點(diǎn)
MDB允許開(kāi)發(fā)者利用已有的在EJB技術(shù)方面的投資,但是仍然可以將這些投資整合到一個(gè)異步消息傳遞的上下文環(huán)境中。例如,JMS客戶機(jī)可以發(fā)送一條消息給一個(gè)MDB(該MDB一直在線等待傳進(jìn)來(lái)的消息),而后者可以訪問(wèn)一個(gè)會(huì)話bean或者一些實(shí)體bean。通過(guò)這種方式,MDB可以被用作一種異步包裝器,提供對(duì)業(yè)務(wù)流程的訪問(wèn)途徑,而之前這些業(yè)務(wù)流程只能通過(guò)一個(gè)同步的RMI/IIOP調(diào)用來(lái)訪問(wèn)。
消息驅(qū)動(dòng)bean本身也是一種強(qiáng)大的消息傳遞解決方案。由于MDB被專門(mén)設(shè)計(jì)用來(lái)作為消息的消費(fèi)者,并且仍然是由EJB容器管理的,因此它們?cè)诳缮炜s性方面提供了巨大的優(yōu)勢(shì)。由于消息bean是無(wú)狀態(tài)的,并且由容器進(jìn)行管理,因此它們并發(fā)地發(fā)送和接收消息(容器只是簡(jiǎn)單地將另一個(gè)bean從池中提出)。這一點(diǎn),加上EJB應(yīng)用服務(wù)器所固有的可伸縮性,構(gòu)成了一種極其健壯的、可伸縮的企業(yè)消息傳遞解決方案。
另一方面,MDB相對(duì)來(lái)說(shuō)還是一種很新鮮的事物,沒(méi)有經(jīng)過(guò)很多的檢驗(yàn)。因而,并不是所有的J2EE供應(yīng)商都支持它們,即使是支持MDB的那些供應(yīng)商也只是最近才實(shí)現(xiàn)它們的。可以預(yù)見(jiàn),MDB的不成熟意味著 供應(yīng)商實(shí)現(xiàn)在穩(wěn)定性和可靠性方面還有一段很長(zhǎng)的路要走。而且,MDB社區(qū)也需要經(jīng)歷更多的錘煉,以獲得一套成形的使用MDB的最佳實(shí)踐。
拋開(kāi)MDB的相對(duì)不成熟性不提,理解它是為專門(mén)的目的而設(shè)計(jì)的(即作為JMS消息的消費(fèi)者)十分重要。MDB只能通過(guò)JMS消息來(lái)調(diào)用,其他方式都不管用。這意味著它們作為消息的消費(fèi)者非常理想,但未必適合作為消息的生產(chǎn)者。消息驅(qū)動(dòng)bean當(dāng)然可以發(fā)送消息,但前提是它首先要讓一條傳進(jìn)來(lái)的請(qǐng)求調(diào)用它。而且,當(dāng)前設(shè)計(jì)的MDB只能映射到單個(gè)的目的地。它們只能在那個(gè)目的地上偵聽(tīng)消息。這一限制在以后的版本中可以改變,但目前您只能為每個(gè)您想偵聽(tīng)的目的地定義一個(gè)MDB。
消息傳遞解決方案指導(dǎo)方針
如前所述,選擇適當(dāng)?shù)慕鉀Q方案時(shí),大部分要做的工作就是衡量您企業(yè)的特定需求,包括目前的需求和可預(yù)見(jiàn)的將來(lái)的需求。如果能記住多種企業(yè)消息傳遞解決方案可以結(jié)合使用,那么也會(huì)很有幫助。在下一節(jié),我們將看一些常見(jiàn)的消息傳遞場(chǎng)景和每個(gè)場(chǎng)景潛在的JMS解決方案。當(dāng)您為您的企業(yè)選擇適當(dāng)?shù)南鬟f技術(shù),或者混合使用多種技術(shù)時(shí),這些內(nèi)容可以 提供一般的指導(dǎo)方針。
從一個(gè)組件訪問(wèn)多個(gè)主題和隊(duì)列
如果您的業(yè)務(wù)流程規(guī)定了消息目的地只能有條件地訪問(wèn)(換句話說(shuō),如果x<5,則訪問(wèn)主題A,如果x>5,則訪問(wèn)主題B),那么您將不能使用 MDB。不過(guò),您可以使用一個(gè)簡(jiǎn)單JMS客戶機(jī),或者將會(huì)話bean與JMS結(jié)合起來(lái)使用。為了在這兩種選擇之間作出決定,您必須在簡(jiǎn)單JMS客戶機(jī)的輕量級(jí)特性(特別適合于applet、Swing應(yīng)用程序和獨(dú)立的控制臺(tái)應(yīng)用程序)以及J2EE容器的健壯性(包括透明的事務(wù)性支持、宣告式安全性和其他EJB型資源管理功能)之間進(jìn)行權(quán)衡。
異步地訪問(wèn)會(huì)話bean和實(shí)體bean
有兩種方式來(lái)處理這一場(chǎng)景。比較明顯的一種方式就是使用一個(gè)消息驅(qū)動(dòng)bean,但前提是您的供應(yīng)商支持MDB技術(shù)。MDB被設(shè)計(jì)用來(lái)消費(fèi)異步消息并代表消息發(fā)送方訪問(wèn)企業(yè)功能性。此外,應(yīng)用服務(wù)器可以維護(hù)一個(gè)MDB的多個(gè)實(shí)例,來(lái)處理并發(fā)的服務(wù)請(qǐng)求。如果您不能使用MDB,您可以創(chuàng)建一個(gè)簡(jiǎn)單JMS客戶機(jī),以此來(lái)作為一個(gè)偵聽(tīng)器。當(dāng)收到一條消息時(shí),該客戶機(jī)便可以與應(yīng)用服務(wù)器建立一個(gè)同步的RMI連接,并按照常規(guī)的方式調(diào)用會(huì)話bean或者實(shí)體bean。不過(guò),MDB是更值得推薦的解決方案。
構(gòu)建盡可能瘦的JMS客戶機(jī)
在這一方面,簡(jiǎn)單JMS客戶機(jī)顯然是贏家。如果對(duì)您來(lái)說(shuō)更重要的是提供一個(gè)輕量級(jí)的消息傳遞客戶機(jī),而不是擁有像會(huì)話bean這樣的J2EE客戶機(jī)的可伸縮性和健壯性,那么簡(jiǎn)單JMS是 正確的選擇。無(wú)論是會(huì)話bean與JMS的組合,還是MDB,兩者都需要一個(gè)J2EE應(yīng)用服務(wù)器,這使得兩種選擇都不適合瘦客戶機(jī)實(shí)現(xiàn)。
并發(fā)地發(fā)送和接收消息
這里惟一合適的選擇是使用消息驅(qū)動(dòng)bean。消息驅(qū)動(dòng)bean是專門(mén)為這一場(chǎng)景量身定做的。從技術(shù)上講,簡(jiǎn)單JMS客戶機(jī)也可以利用多線程技術(shù)來(lái)提供類似的支持,但這種解決方案開(kāi)發(fā)起來(lái)很復(fù)雜,并且最后開(kāi)發(fā)出來(lái)的東西并沒(méi)有很好的可伸縮性。
將消息傳遞合并到J2EE過(guò)程中
您或許已經(jīng)在J2EE體系結(jié)構(gòu)中有所投入,并且認(rèn)識(shí)到將企業(yè)消息傳遞合并到這些J2EE過(guò)程中的需要。在大多數(shù)情況下,您最好的解決方案是將會(huì)話bean 與JMS資源連接結(jié)合起來(lái)使用。您可以采用已有的會(huì)話bean來(lái)訪問(wèn)一個(gè)或多個(gè)主題和隊(duì)列,而不必重建整個(gè)基礎(chǔ)設(shè)施。這些會(huì)話bean將繼續(xù)履行傳統(tǒng)的對(duì)業(yè)務(wù)服務(wù)的請(qǐng)求,并且還 擔(dān)負(fù)起了消息傳遞的任務(wù)。在某些情況下,將您已有的業(yè)務(wù)服務(wù)暴露給一個(gè)JMS客戶機(jī)是有好處的,這從前面的討論中也可以發(fā)現(xiàn)。
結(jié)束語(yǔ)
就今天技術(shù)前景的多樣性和日趨于異步的特點(diǎn)來(lái)說(shuō),消息傳遞是一種激動(dòng)人心的、日益流行的解決方案。Java 消息服務(wù)提供了一種獨(dú)立于供應(yīng)商和平臺(tái)的媒介,通過(guò)使用企業(yè)消息傳遞將多個(gè)系統(tǒng)系在一起。在本文中,我們簡(jiǎn)要地瀏覽了企業(yè)消息傳遞和JMS,并且給出了一些指導(dǎo)方針,以方便您選擇最適合您企業(yè)的解決方案。