站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题关于EJB的基本概念和例子

关于EJB的基本概念和例子

摘要: Enterprise JavaBean(EJB)是一種元件的架構,用來開發及配置分散式物件導向的企業應用系統。 而且它是放在支援EJB平台的伺服器上,一些RMI、Concurrency, Transaction, Security等等問題,可 交由伺服器來管理,使用者可以著重於企業流程的開發。(
EJB概論
來源:凌群電腦 cww整理

Enterprise JavaBean(EJB)是一種元件的架構,用來開發及配置分散式物件導向的企業應用系統。
而且它是放在支援EJB平台的伺服器上,一些RMI、Concurrency, Transaction, Security等等問題,可
交由伺服器來管理,使用者可以著重於企業流程的開發。(就如ActiveX之於MTS一般)

EJB可分成 Session Bean與Entity Bean,它們卻有不一樣的用途.

Session Bean代表工作流程.所謂工作流程是完成特定任務所需採行的步驟,例如門診掛號或證券
下單都是一種工作流程,也就是我們常稱的Business Logic.Session Bean可以呼叫其他的EJB,藉
由彼此的分工合作完成特定任務.在一般狀況下,Session Bean是不會用來連結資料庫[註1]

Entity Bean代表資料庫中的資料.它將資料物件化,一個Entity Bean的instance代表資料庫內資料表
中的一筆資料.每一筆資料的欄位值會對應到Entity Bean所宣告的變數,應用程式透過存取Entity Bean的變數,達到同步存取資料庫中的資料的目的.

註1:在EJB的架構中,Entity Bean是被設計經由JDBC來存取關聯式資料庫.如MS-SQL,Informix,Oracle,
Sybase等等.若是要連接非關聯式資料庫,如mainframe上的資料庫,就無法使用Entity Bean,這時就必
須撰寫Session Bean來模擬Entity Bean.

Session Bean又可分成stateless/stateful

Stateless Session Bean


當所要撰寫的EJB是屬於一般用途或是需要重複使用,這時會選擇用Stateless Session Bean.StatelessSession Bean的生命週期很短,Client端呼叫它時它被建立,當Client呼叫完畢,它會被EJB Container丟到Pool中,等待其他人來使用,直到AP Server shutdown.

因為Stateless Session Bean不保留任何狀態 (State),呼叫它的Client端必須負責維護自己的狀態,
所以它很節省系統資源,也可被重複使用,少數幾個Stateless Session Bean便可以為許多Client端來提
供服務,我們可以把它當作procedure使用,它會根據傳入的參數來進行運算並傳回結果.舉例來說,像公斤轉換磅的計算程式就非常適合寫成Stateless Session Bean.
Stateless Session Bean整個生命週期中,並不會保留Client端傳入的state,所以可以被任何一個Client端
重複呼叫使用.以WebLogic Server為例,它建立了一個“free pool”的機制,並且在裡面放了一些Stateless Session Bean的Instance.當Client端呼叫某個Stateless Session Bean時,WLS會到free pool找一找,看看有沒有沒事做的Instance,如果有就把它傳給Client使用,沒有才建立新的Instance.當Client端用完Instance了,EJB Container便會將Client端與Instance解除關係,並將Instance放回free pool供其他Client端使用。如果Client再度要求做事,則不一定會以哪一個Instance來做回應,可能是方才那個,也可能不是。

Stateful Session Bean
Stateful Session Bean在整個生命週期中保留Client端呼叫時所傳入的狀態(State),它只能為一個特定的Client端提供服務(一對一),無法由不同的Client端輪流使用,也不會放在instance pool中,所以Stateful Session Bean內的變數可以Client端在執行其內含之method的過程中保存用戶端的相關資料,因此先前執行的method對Stateful Session Bean的狀態資料造成更動,會影響之後執行的method的執行結果。例如,Amazon上的“購物車”就十分適合寫成Stateful Session Bean,我們將放入購物車的書籍資料記錄在Stateful Session Bean的State中,當客戶要結帳時,就可以直接根據State的內容直接計算出應付金額。因為每個Client端都會擁有自己專屬的Stateful Session Bean instance,而每一個Stateful Session Beaninstance都會在AP Server上佔據一塊記憶體,保存Client端所傳入的狀態資料,這樣的做法會使得AP Server loading加大,為了節省系統資源,EJB Container會將存在記憶體中超過閒置時間的Stateful Session Bean instance自動鈍化 ( Passivated ),並依照Java Object Serialization規則將狀態儲存至磁碟,然後再將Stateful Session Bean instance從記憶體中移出,當該Stateful Session Bean再被叫用時EJB Container自動活化 ( Activated ) 此Stateful Session Bean instance並載入之前儲存的狀態。不過Java中有一稱為transient field的變數,它不會隨序列化而儲存其狀態,處理它時,要特別注意。

Stateful Session Bean的運作方式則和Stateless Session Bean截然不同.Stateful Session Bean在
整個生命週期中只服務一個Client端(一對一),所以每次Client端一呼叫Stateful Session Bean,EJB
Container就必須建立一個新的Instance.Stateful Session Bean可以保留Client所傳入的狀態,直到被
EJB Container消滅為止.

EJB禁止同時使用Bean Instance,在Client端呼叫某個Method時,若該Method未執行完畢,是沒有人可以用該Bean Instance,這解決了Concurrency的問題,而這個功能是由AP Server負責的。另外session Bean也被設定成不可重覆進入,意思是Client呼叫EJB-A做事,EBJ-A又呼叫EJB-B做事,而EJB-B又呼叫EJB-A做事,若真有這事發生,會產生RemoteException的例外。EJB-A呼叫EJB-B做事時,和Client呼叫EJB-B做事的方式相同,不會因為EJB-A與EBJ-B在相同的AP Server上而有所不同。


開發EJB時一般需要為它定義兩個介面與兩個類別:
Remote Interface:
繼承自javax.ejb.EJBObject,該介面提供了外界使用Bean的Method
Home Interface:
繼承自javax.ejb.EJBHome,提供建立、移除、尋找bean的Method
Bean Class:
Bean的主體,所有的Bussiness Logic都寫在這裡
Primary Key Class:
只有Entity Bean才會用上它,用來指向Database的某筆Record

 

EJB Object的觀念
Bean class是整個程式的主體,但是Client端並不是和Bean Class做溝通,而是和EJB Object做溝
通。我們想像一下,只是單純的寫這些Remote Interface/Home Interface/Bean Class等,而沒有寫任
何網路的程式,我們的Client如何叫Server(bean)做事,又如何把執行的結果傳回Client?其實Client
沒有和bean class溝通,當然不用有這些網路相關的程式,而Client與Server間的網路溝通是由EJB
Object來做的。Client端產生EJB Object的Remote Reference(stub),而Server端是EJB Object,而EJB Object又封裝了bean instance,所以我們便可以想像EJB Object有bean class的功能又有javax.ejb.EJBObject定義的功能,而EJB Object是由AP Server(WebLogic)依據我們對EnterPrise JavaBean的定義而自動產生。

 


↑返回目录
前一篇: 关于EJB的基本概念和例子2
后一篇: 使用处理链处理WEB服务中的请求/响应消息