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