??? EJB 1.0
和1.1規(guī)范只定義了一種在EJB組件中引用另一組件的方法,即通過(guò)Bean的遠(yuǎn)程接口。如果兩個(gè)Bean都在同一個(gè)容器之內(nèi),則這種網(wǎng)絡(luò)開(kāi)銷是不必要的。為解決這個(gè)問(wèn)題,EJB 2.0規(guī)范定義了一種新的EJB引用類型,即本地引用。
一、兩種引用類型
為了從其他EJB組件訪問(wèn)某個(gè)Bean,容器提供了一種特殊的機(jī)制。這種機(jī)制允許一個(gè)Bean提供者通過(guò)稱為EJB引用的“邏輯名字”引用另一個(gè)EJB的Home。EJB容器利用應(yīng)用的部署描述器為EJB構(gòu)造環(huán)境,而這些引用在部署描述器中作為特殊的項(xiàng)目聲明。在部署描述器中,部署者把組件代碼中要用到的EJB引用綁定到其他被引用EJB的Home。
如前所述,在EJB 2.0規(guī)范出現(xiàn)之前,在一個(gè)EJB中引用其他Bean只有一種方法,即通過(guò)遠(yuǎn)程接口,它要求進(jìn)行跨越網(wǎng)絡(luò)的遠(yuǎn)程過(guò)程調(diào)用。如果某個(gè)事務(wù)由多個(gè)Bean協(xié)作完成,通過(guò)網(wǎng)絡(luò)進(jìn)行多個(gè)對(duì)象的匯集和釋放將是一項(xiàng)相當(dāng)繁重的工作。
EJB 2.0規(guī)范新增了一種本地接口類型,允許在同一容器之內(nèi)的Bean直接互相引用,避免了遠(yuǎn)程接口的網(wǎng)絡(luò)開(kāi)銷。本地接口是一種標(biāo)準(zhǔn)的Java接口,而不是從RMI繼承得到。EJB組件的定義可以包含本地接口或遠(yuǎn)程接口,或者兩者都定義。
本地引用的指定方式和傳統(tǒng)的遠(yuǎn)程引用一樣,即在部署描述器中指定。事實(shí)上,本地引用的部署描述元素與遠(yuǎn)程引用的描述元素完全對(duì)應(yīng)。
下面的代碼片斷是一個(gè)典型的遠(yuǎn)程引用:
Product
ejb/Product
Entity
com.xyz.widgets.ProductHome
com.xyz.widgets.Product
../products/product.jar#Product
下面的代碼片斷是同一Bean的本地引用:
Product
ejb/Product
Entity
com.xyz.widgets.ProductHome
com.xyz.widgets.Product
../products/product.jar#Product
下表簡(jiǎn)要說(shuō)明了各個(gè)元素的用途:
二、創(chuàng)建本地接口,通過(guò)本地接口訪問(wèn)EJB
要把一個(gè)現(xiàn)有的遠(yuǎn)程接口改為本地接口,有三個(gè)地方必須修改:部署描述器,Bean的接口,以及對(duì)EJB的調(diào)用。前面我們介紹了如何通過(guò)部署描述器指定一個(gè)本地引用,現(xiàn)在我們要把遠(yuǎn)程接口轉(zhuǎn)換成本地接口,然后修改JNDI查找調(diào)用,讓它使用新的本地接口。
■ Home接口
指定Home接口時(shí),現(xiàn)在必須導(dǎo)入的是“javax.ejb.EJBLocalHome”,而不是“javax.ejb.EJBHome”。接口的聲明也必須改變,讓它從“EJBLocalHome”(一個(gè)標(biāo)準(zhǔn)Java接口)繼承,而不是從“EJBHome”(一個(gè)RMI接口)繼承。同時(shí),從該接口定義的方法中唯一應(yīng)該拋出的異常是javax.ejb.CreateException,而java.rmi.RemoteException異常則不再必要。
■ 本地接口
指定本地接口時(shí),現(xiàn)在必須導(dǎo)入“javax.ejb.EJBLocalObject”,而不是“javax.ejb.EJBObject”。接口聲明也必須改變,讓它從“EJBLocalObject”(一個(gè)本地接口)繼承,而不是從“EJBObject”(一個(gè)RMI接口)繼承。
■ 執(zhí)行調(diào)用
創(chuàng)建好接口、設(shè)置好部署描述器之后,剩下的工作就是執(zhí)行JNDI調(diào)用,查找對(duì)其他EJB的引用。調(diào)用Bean的遠(yuǎn)程接口時(shí),javax.rmi.PortableRemoteObject的“narrow()”方法匯集經(jīng)過(guò)RMI的調(diào)用。對(duì)于本地引用,這種開(kāi)銷就不再必要,這時(shí)只需簡(jiǎn)單地進(jìn)行JNDI查找并進(jìn)行適當(dāng)?shù)念愋投ㄐ汀O旅媸且粋€(gè)例子:
home = (ProductHome) initCtx.lookup("java:comp/env/ejb/Product");
它不僅提高了效率,而且代碼也比用來(lái)獲取遠(yuǎn)程接口的代碼更直觀易懂。
本地接口使得處于同一容器內(nèi)的兩個(gè)EJB組件能夠更高效地進(jìn)行通信。對(duì)于實(shí)體Bean的應(yīng)用來(lái)說(shuō),這種技術(shù)尤其有用,因?yàn)榕c客戶程序直接訪問(wèn)實(shí)體Bean相比,在實(shí)踐中,通過(guò)會(huì)話Bean訪問(wèn)實(shí)體Bean得到了更廣泛的認(rèn)可。
如果你準(zhǔn)備使用本地引用,請(qǐng)先檢查自己的應(yīng)用服務(wù)器平臺(tái)是否支持它。也許,在EJB 2.0規(guī)范獲得廣泛應(yīng)用之前,我們還得等待一段時(shí)間。
posted on 2006-07-31 10:33
心隨我動(dòng) 閱讀(240)
評(píng)論(0) 編輯 收藏 所屬分類:
EJB