?? 第二部分:ejb 編程模型(轉(zhuǎn)).txt
字號:
EJB 體系結(jié)構(gòu)包括 EJB 服務(wù)器和 EJB 容器兩個概念。EJB 服務(wù)器充當(dāng)一種組件執(zhí)行系統(tǒng),正如 EJB 白皮書中所述:
[BLOCKQUOTE]“Enterprise JavaBeans 規(guī)范為每個支持完全可移植性的 Java 應(yīng)用程序服務(wù)器定義了一個標(biāo)準(zhǔn)模型。任何廠商都可以使用此模型來實(shí)現(xiàn)對 Enterprise JavaBeans 組件的支持。多種系統(tǒng)(如 TP 監(jiān)視器、CORBA 運(yùn)行時(shí)系統(tǒng)、COM 運(yùn)行時(shí)系統(tǒng)、數(shù)據(jù)庫系統(tǒng)、Web 服務(wù)器系統(tǒng)或其它基于服務(wù)器的運(yùn)行時(shí)系統(tǒng))都可以調(diào)整到能夠支持可移植的 Enterprise JavaBeans 組件?!?Thomas, [I]Enterprise JavaBeans Technology: Server Component Model for the Java Platform[/I])[/BLOCKQUOTE]
EJB 服務(wù)器為使用 EJB 組件的應(yīng)用程序提供操作環(huán)境,并供應(yīng)所有必需的服務(wù),來支持 EJB 體系結(jié)構(gòu)。打包 EJB 服務(wù)器軟件并沒有預(yù)先規(guī)定的方式。一種方法是將它作為一項(xiàng)功能增強(qiáng)包括到應(yīng)用程序服務(wù)器中,這就是在 IBM WebSphere Application Server, Advanced Edition, Version 2.0 中采用的方法。
EJB 組件并不在 EJB 服務(wù)器的頂部直接執(zhí)行。一個稱為 EJB 容器的中間軟件組件在 EJB 服務(wù)器環(huán)境中運(yùn)行,從而又為這些 bean 自身提供操作環(huán)境。EJB 容器對 EJB 應(yīng)用程序是完全透明的,但是在支持 bean 操作方面起著關(guān)鍵性的作用。
為了使 enterprise bean 能充當(dāng)可重用的軟件組件,它們對特定的服務(wù)器或平臺功能不能有內(nèi)建的相關(guān)性。服務(wù)器端功能的幾種常見類型已經(jīng)被從 bean 設(shè)計(jì)中“分離出去”,而將此功能的責(zé)任轉(zhuǎn)移給了容器組件。例如,容器將被用來接管安全性、并發(fā)性、事務(wù)處理、交換到輔助存儲器和其它服務(wù)的責(zé)任,從而使 bean 免受服務(wù)器相關(guān)性的制約,并將按業(yè)務(wù)邏輯來優(yōu)化,而不是按服務(wù)邏輯來優(yōu)化。
EJB 白皮書這樣描述容器的作用:
[BLOCKQUOTE]“EJB 容器管理部署于其中的 enterprise bean??蛻魴C(jī)應(yīng)用程序并不直接與 enterprise bean 進(jìn)行交互。相反,客戶機(jī)應(yīng)用程序通過由容器生成的兩個封裝接口( EJB Home 接口和 EJB Object 接口)與 enterprise bean 進(jìn)行交互。當(dāng)客戶機(jī)使用封裝接口調(diào)用各種操作時(shí),容器截獲每個方法調(diào)用,并插入管理服務(wù)。”(Thomas, [I]Enterprise JavaBeans Technology: Server Component Model for the Java Platform[/I])[/BLOCKQUOTE]
可以期望 EJB 容器軟件一般都會隨 EJB 服務(wù)器軟件一起提供,盡管規(guī)范允許分離這些組件。除了提供對運(yùn)行時(shí)服務(wù)(如事務(wù)處理和安全性)的訪問以外,還期望 EJB 容器包括各種必要工具,來支持 enterprise bean 的安裝、操作和管理。例如,需要有工具解釋 EJB jar 文件的內(nèi)容,有工具生成數(shù)據(jù)庫訪問,來獲得容器提供的持久性,有工具監(jiān)視正在運(yùn)行的 bean 的行為,以及實(shí)現(xiàn)安全性等。
[b]Bean 風(fēng)格[/b]
EJB 組件分為兩種主要類別 -- [I]會話 bean[/I] 和[I]實(shí)體 bean[/I]。根據(jù) bean 處理狀態(tài)、事務(wù)和持久性的方式這些類別還可以進(jìn)一步細(xì)分。會話 bean 通常具有以下屬性: [UL][LI]代表單個客戶機(jī)執(zhí)行 [LI]可以是事務(wù)性的 [LI]可以更新共享數(shù)據(jù)庫中的數(shù)據(jù) [LI]生存期相對較短 [LI]其生存期通常就是客戶機(jī)的生存期 [LI]任何持久性數(shù)據(jù)都由 bean 管理 [LI]可以依容器的判斷予以刪除 [LI]會在 EJB 服務(wù)器失敗時(shí)被刪除 [/LI][/UL]
實(shí)體 bean 通常具有以下屬性:[UL][LI]代表數(shù)據(jù)庫中的數(shù)據(jù) [LI]是事務(wù)性的 [LI]允許多個用戶共同訪問 [LI]可以長期存在 [LI]持久性數(shù)據(jù)可以由容器管理 [LI]在 EJB 服務(wù)器失敗后能繼續(xù)生存[/LI][/UL]
EJB 規(guī)范對會話 bean 和實(shí)體 bean 的說明如下:
[BLOCKQUOTE]“對于客戶機(jī),會話 enterprise bean 是一種非持久性的對象,它實(shí)現(xiàn)某些在服務(wù)器上運(yùn)行的業(yè)務(wù)邏輯。想像一個會話對象的一種方式是:會話對象是運(yùn)行在服務(wù)器上的客戶機(jī)程序的邏輯擴(kuò)展。會話對象不在多臺客戶機(jī)之間共享。[/BLOCKQUOTE]
[BLOCKQUOTE]“對于客戶機(jī),實(shí)體 enterprise bean 是一種持久性對象,它代表一個存儲在持久性存儲器(例如,一個數(shù)據(jù)庫)中的實(shí)體的對象視圖,或者是一個由現(xiàn)有企業(yè)應(yīng)用程序?qū)崿F(xiàn)的實(shí)體?!?[I]Enterprise JavaBeans Specification 1.0[/I]) [/BLOCKQUOTE]
用一種粗略的說法,[I]會話 bean 代表這樣的操作,它檢索或存儲數(shù)據(jù)以滿足用戶請求;而實(shí)體 bean 則代表一種數(shù)據(jù)集,可以訪問這些數(shù)據(jù)集來滿足用戶請求。[/I]
[B]會話 bean[/B]
最簡單的一種 Enterprise JavaBeans 組件就是[I]無狀態(tài)的會話 bean[/I]。因?yàn)檫@些 bean 沒有可以區(qū)分它們的狀態(tài),所有的實(shí)例都是完全相同的。容器管理無狀態(tài)會話 bean 的生存周期,其方式是通過創(chuàng)建足夠數(shù)目的此種 bean 來適應(yīng)客戶機(jī)工作負(fù)荷,并在不需要它們時(shí)將其刪除。[I]鈍化[/I],即將閑置的 bean 寫到磁盤上,不用于無狀態(tài)的會話。要調(diào)用 bean,客戶機(jī)程序調(diào)用本地接口中的 standard create() 方法,盡管此操作不一定導(dǎo)致實(shí)例化新的 bean 實(shí)例。容器可以選擇將客戶機(jī)請求發(fā)送給現(xiàn)有的對象。反之,容器則可以按它的選擇創(chuàng)建新的實(shí)例,且獨(dú)立于由客戶機(jī)發(fā)布的 create() 方法。
在 EJB 本地對象上發(fā)布的 create() 調(diào)用返回一個對 EJB 對象的引用,這個 EJB 對象代表 enterprise bean。一旦客戶機(jī)有了 EJB 對象引用,它就可以將業(yè)務(wù)方法發(fā)布到 EJB 對象上,容器隨之會將這些方法委托給 bean 自身。負(fù)責(zé)管理會話 bean 的容器組件無需推斷會話 bean 是否是無狀態(tài)的。會話 bean 是無狀態(tài)的還是有狀態(tài)的在安裝時(shí)聲明。
如果會話 bean 在方法調(diào)用之間保留狀態(tài)信息,則它是[I]有狀態(tài)的[/I]。通過調(diào)用 ejbPassivate() 方法,容器可以依其判斷將有狀態(tài)會話 bean 鈍化,或?qū)懙捷o助存儲器中。EJB 規(guī)范并不要求容器在鈍化 bean 時(shí)使用 Java 串行化協(xié)議,但是它們必須提供等價(jià)的功能。當(dāng)容器決定將一個非活動的會話 bean 交換回到內(nèi)存中時(shí),它會取消被動 bean 的串行化,并調(diào)用 ejbActivate() 方法。有狀態(tài)會話 bean 的開發(fā)人員負(fù)責(zé)確保狀態(tài)數(shù)據(jù)是可串行化的。在集群的應(yīng)用程序服務(wù)器環(huán)境中實(shí)現(xiàn)有狀態(tài)會話 bean 時(shí)務(wù)必要小心,因?yàn)椴⒉皇撬械姆?wù)器都支持集群的有狀態(tài)會話 bean 的同步化。
有狀態(tài)會話 bean 可以是事務(wù)性的。通過使用 javax.transaction.UserTransaction 接口中的方法,如 begin()、commit() 和 rollback(),bean 可以控制事務(wù);通過實(shí)現(xiàn) javax.ejb.SessionSynchronization 接口,bean 可以接收有關(guān)事務(wù)狀態(tài)的通知。EJB 容器無需推斷哪些 bean 需要事務(wù)支持;UserTransaction 接口僅可用于那些在安裝時(shí)被標(biāo)記為事務(wù)性的 bean。
[B]實(shí)體 bean[/B]
實(shí)體 bean 在體系結(jié)構(gòu)上與會話 bean 類似,但它們提供對企業(yè)數(shù)據(jù)的訪問,而不是支持用戶會話。一個實(shí)體 bean 可以支持多個并發(fā)用戶,而容器則使訪問和事務(wù)同步化。實(shí)體 bean 還具有支持本地對象中的 finder 方法的主鍵。知道實(shí)體 bean 的主鍵的客戶機(jī)可以通過調(diào)用本地對象上的 findBy PrimaryKey() 方法獲得對象引用。與會話 bean 不同,實(shí)體 bean 的本地對象除了具有 create 方法外還具有 finder 方法。
持久性是實(shí)體 bean 的一個基本屬性。EJB 規(guī)范允許兩種形式的實(shí)體持久性:bean 管理的持久性和容器管理的持久性。對于代表關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)的實(shí)體 bean,bean 對持久性的管理意味著,對數(shù)據(jù)庫訪問的調(diào)用是直接編寫在企業(yè) bean 的方法中的(使用 JDBC 或 SQLJ)。這種方法是直截了當(dāng)?shù)?,但它降低了可移植性。容器對持久性的管理意味?bean 不受數(shù)據(jù)庫調(diào)用的影響。在安裝時(shí)告知容器有關(guān) bean 數(shù)據(jù)所需的持久性,而容器負(fù)責(zé)生成實(shí)現(xiàn)持久性的代碼。這種方法允許 bean 的可移植性更高,甚至達(dá)到持久性可使用不同數(shù)據(jù)源的程度。然而,此方法要求容器中要有復(fù)雜功能。
當(dāng)實(shí)體 bean 對象與 EJB 對象相關(guān)聯(lián)時(shí),前者處于[I]就緒[/I]狀態(tài);否則將認(rèn)為它們處于[I]共享[/I]狀態(tài)。當(dāng)客戶機(jī)調(diào)用 EJB 對象中的方法時(shí),容器查找關(guān)聯(lián)的實(shí)體 bean 的實(shí)例(如果存在的話),或者從共享狀態(tài)中傳送出一個實(shí)例。處于就緒狀態(tài)的實(shí)體 bean 可以接收到通過委托從客戶機(jī)傳播給它們的業(yè)務(wù)方法調(diào)用。它們還可以在容器請求時(shí)執(zhí)行 ejbLoad() 和 ejbStore() 方法。load 方法和 store 方法旨在維持實(shí)體 bean 和基礎(chǔ)數(shù)據(jù)存儲之間數(shù)據(jù)的一致性。
實(shí)體 bean 支持多個用戶并發(fā)地訪問數(shù)據(jù)。EJB 規(guī)范聲明,維持?jǐn)?shù)據(jù)完整性是容器的責(zé)任:
[BLOCKQUOTE]“enterprise bean 開發(fā)人員在編寫業(yè)務(wù)方法時(shí)無需擔(dān)心來自多個事務(wù)的并發(fā)訪問。enterprise bean 開發(fā)人員在編寫方法時(shí)可以假定,對于被多個事務(wù)同時(shí)訪問的各個實(shí)體 bean,將能確保適當(dāng)?shù)耐交??!?[I]Enterprise JavaBeans Specification 1.0[/I]) [/BLOCKQUOTE]
容器完成這一任務(wù)通常是通過鎖定數(shù)據(jù)庫中的數(shù)據(jù),并使訪問串行化,或通過創(chuàng)建實(shí)體 bean 的多個實(shí)例,并允許在基礎(chǔ)數(shù)據(jù)存儲中使用并發(fā)控制,這樣來管理訪問。
[b]第三部分內(nèi)容預(yù)告[/b]
“什么是 Enterprise JavaBeans 組件?”的第三部分將討論安裝 EJB 組件的特殊部署過程。它還將說明 CORBA 是否是 EJB 組件的競爭對手(答案是“否” -- 請參閱 EJB 技術(shù)是如何補(bǔ)充 CORBA 的)。最后,您將看到一種基于 EJB 的三層編程模型的使用情況。
[b]參考資料[/b]
[UL][LI]查閱 [url href=ftp://ftp.javasoft.com/docs/ejb/ejb.10.pdf]Enterprise JavaBeans Specification 1.0[/url]。 [LI]要了解有關(guān) EJB 體系結(jié)構(gòu)的更多內(nèi)容,請參閱 Anne Thomas 的 [url href=http://www.javasoft.com/products/ejb/pdf/white_paper.pdf][I]Enterprise JavaBeans Technology: Server Component Model for the Java Platform[/I][/url],Patricia Seybold Group。 [LI]要了解有關(guān) Java 技術(shù)和 EJB 體系結(jié)構(gòu)的更多內(nèi)容,請?jiān)L問 [url href=http://www.java.sun.com/products/ejb]Sun 的網(wǎng)站[/url]。 [/LI][/UL]
[b]作者簡介[/b]
Ken Nordby 是 IBM 軟件開發(fā)實(shí)驗(yàn)室的軟件工程師,該實(shí)驗(yàn)室位于 Research Triangle Park,North Carolina。作為 SWG Product Affinity Services 業(yè)務(wù)小組的成員,Ken 與這樣一些 IBM 人共事,他們?yōu)?IBM 的 WebSphere Application Server(即 Enterprise JavaBeans 技術(shù)的 IBM 實(shí)現(xiàn))從事開發(fā)和咨詢工作??梢酝ㄟ^ [email]nordby@us.ibm.com[/email] 與 Ken 聯(lián)系。
[/TD][/TR][/TABLE]
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -