top
Loading...
EnterpriseJavaBeans導論三
b>會話bean

會話bean是一種通過home interface創建并對客戶端連接專有的enterprise bean.會話bean實例一般不與其它客戶端共享。這允許會話bean維護客戶端的狀態。會話bean的一個例子是購貨車,眾多顧客可以同時購貨,想他們自己的購貨車中加東西,而不是向一個公共的購貨車中加私人的貨物。

定義一個會話bean可以通過定義一個實現javax.ejb.SessionBean接口的類來創建一個會話bean.該接口定義如下:
public interface javax.ejb.SessionBean extends javax.ejb.EnterpriseBean {
public void ejbActivate() throws RemoteException;
public void ejbPassivate() throws RemoteException;
public void ejbRemove() throws RemoteException;
public void setSessionContext(SessionContext context)
throws RemoteException;
}
javax.ejb.EnterpriseBean是一個空接口,是會話bean和實體bean的超類。

會話bean的交換

容器開發商可以實現把會話bean的實例從主存移到二級存儲中的交換機制,這可以增加一段時間內實例化的會話bean的總數。容器維護一個bean的時間期限,當某個bean的不活動狀態時間達到這個闕值,容器就把這個bean拷貝到二級存儲中并從主存中刪除。容器可以使用任何機制來實現bean的持久性存儲。最常用的方式是通過bean的串行化。Bean開發者在bean中應避免使用transient fields。EjbActivate()和ejbPassivate()用來維護這個fields值。

活化和鈍化

為了支持廠商提供會話bean的交換,規范定義了鈍化--把bean從主存轉移到二級存儲的過程,活化--把bean恢復到主存中去的過程。在SessionBean接口中聲明的EjbActivate()和ejbPassivate()方法,允許容器通知已經被活化的bean它將要被鈍化。Bean開發者可以用這些方法釋放和恢復處于鈍化狀態的bean所占有的值、引用和系統資源。一個可能的例子是數據庫連接,作為有限的系統資源,不能被鈍化的bean使
用。

有了這些方法就使得不必在使用transient.事實上,使用transient可能是不安全的,因為串行化機制自動地把值設為null或0。而通過ejbActivate()和ejbPassivate()方法顯式地設置這些fields更好一些。依靠Java的串性化機制把transient fields設成null也是不可移植的,因為當bean部署在不使用Java的串性化機制獲得持久性的EJB容器中時該行為會發生改變。 萜韃惶峁┙換唬敲湊廡┓椒ń澇恫換岜壞饔謾?當客戶端調用bean的商業方法時鈍化的bean被激活。當EJBObject收到方法調用的請求時,它通知容器需要活化的bean.當活化完成時,EJBObject代理對bean的方法調用。 如果bean 參與一個事務,那么它不能被鈍化。把bean放在主存中更有效率,因為事務通常在很短的時間內完成。如果bean沒有鈍化前必須釋放或活化前必須重置的狀態,那么這些方法可置空。在大多數情況下,bean開發者不必在這些方法中做任何事。

會話bean的狀態管理

會話bean的部署描述符必須聲明該bean是有狀態或無狀態的。一個無狀態bean是在方法調用間不維護任何狀態信息的bean。通常,會話bean的優點是代替客戶端維護狀態。然而,讓會話bean無狀態也有一個好處。無狀態bean不能被鈍化。因為它不維護狀態,所以沒有需要保存的信息。容器可以刪除bean的實例。客戶端永遠不會知道無狀態bean的刪除過程。客戶端的引用是EJBObject.如果客戶端稍后又調用了一個商業方法,則EJBObject通知容器在實例化一個新的會話bean.因為沒有狀態,因此也沒有信息需要恢復。

無狀態bean可以在客戶端間共享,只是在某一時刻只能有一個客戶端執行一個方法。因為在方法調用間沒有需要維護的狀態,所以客戶端可使用任何無狀態bean的實例。這使 得容器可以維護一個較小的可服用bean的緩沖池,節省主存。因為無狀態bean在方法調 用間不能維護狀態,因此從技術上講在home interface的create()方法不應有參數。在創建時向bean傳遞參數意味著在ejbCreate()返回時需要維護bean的狀態。而且,經由EJBObject調用商業方法的結果使得容器必須能重創建一個無狀態的bean.這時在開始創建bean時的參數就不存在了。廠商的安裝工具應該能檢查home interface的無狀態對話bean以保證其不包含帶參數的create()方法。


轉自 www.chinacode.net 中國代碼聯盟新聞組

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com