Conversational versus Nonconversational Session Beans
如何寫會話Bean 寫會話bean的類,必須實(shí)現(xiàn)javax.ejb.SessionBean接口 public interface javax.ejb.SessionBean extends javax.ejb.EnterpriseBean { public abstract void setSessionContext(SessionContext ctx) throws java.rmi.RemoteException;
public abstract void ejbPassivate() throws java.rmi.RemoteException;
public abstract void ejbActivate() throws java.rmi.RemoteException;
public abstract void ejbRemove() throws java.rmi.RemoteException; } 會話bean和實(shí)體bean都繼續(xù)了javax.ejb.EnterpriseBean接口 讓我們具體看看接口中的各種方法: setSessionContext(SessionContext ctx) 容器調(diào)用這個方法來通過會話上下文與bean連接。Bean可以通過會話上下文向容器查詢當(dāng)前事物的狀態(tài)和當(dāng)前的安全狀態(tài)等。 import javax.ejb.*; public class MyBean implements SessionBean { private SessionContext ctx; public void setSessionContext(SessionContext ctx) { this.ctx = ctx; } ... }
ejbCreate(…) 用來初始化你的會話bean,可以定義多個不同參數(shù)的ejbCreate()方法來用不同的方法初始化bean。 import javax.ejb.*; public class MyBean implements SessionBean { private int memberVariable; public void ejbCreate(int initialValue) { this.memberVariable = initialValue; } ... } ejbCreate()方法是容器可以調(diào)用的callback方法,客戶端代碼不能調(diào)用它,因?yàn)榭蛻舳瞬荒苤苯犹幚韇eans??他們必須通過容器,但是客戶端必須采用某種方法向ejbCreate方法傳遞參數(shù),客戶端提供初始化參數(shù)。Home接口是客戶端用來初始化調(diào)用的接口工廠。你必須在home接口中復(fù)制每一個ejbCreate()方法,例如:假如在bean類中你有下面的ejbCreate方法 public void ejbCreate(int i) throws ... 那么你必須在你的home接口里有下面的create()方法 public void create(int i) throws ... 客戶端調(diào)用home接口中的create()方法,將參數(shù)傳遞給ejbCreate()。 EjbPassivate() 假如出現(xiàn)太多的實(shí)例bean,EJB容器可以將它們中的一些鈍化,將它們寫到臨時的存出空間例如數(shù)據(jù)庫或文件系統(tǒng)。容器釋放它們所申請的空間。 import javax.ejb.*; public class MyBean implements SessionBean { public void ejbPassivate() { <close socket connections, etc...> } ... } ejbActivate() 當(dāng)客戶需要使用被鈍化的bean時,容器將被鈍化的bean重新導(dǎo)入內(nèi)存,激活它們。 Bean又被導(dǎo)致內(nèi)存,這時需要重新得到bean所需要的資源。 import javax.ejb.*; public class MyBean implements SessionBean { public void ejbActivate() { <open socket connections, etc...> } ... } ejbRemove() 當(dāng)容器將會話bean實(shí)例remove掉時,調(diào)用此方法。所有的bean都有這種方法,它沒有參數(shù),它將釋放所有以分配的資源。 import javax.ejb.*; public class MyBean implements SessionBean { public void ejbRemove() { <prepare for destrUCtion> } ... } 容器可以在任何時候調(diào)用ejbRemove()方法,但假如碰到異常,則有可能禁止容器調(diào)用此方法。
業(yè)務(wù)方法 應(yīng)該定義一些解決業(yè)務(wù)問題的方法:例如: import javax.ejb.*; public class MyBean implements SessionBean { public int add(int i, int j) { return (i + j); } ... } 因?yàn)榭蛻舳艘{(diào)用這些方法,因此,你必須在bean的遠(yuǎn)程接口中列出這些方法。
得到Home對象的參考 /* * Get System properties for JNDI initialization */ Properties props = System.getProperties(); /* * Form an initial context */ Context ctx = new InitialContext(props); /* * Get a reference to the home object - the * factory for EJB objects */ MyHome home = (MyHome) ctx.lookup("MyHome"); 建立EJB對象 得到Home對象以后,可以將Home對象作為建立EJB對象的工廠。調(diào)用create()方法建立EJB對象。 MyRemoteInterface ejbObject = home.create(); 無參數(shù)是因?yàn)闊o狀態(tài)beans不需要初始參數(shù)。 調(diào)用方法 客戶端有了EJB對象以后就可以通過它來調(diào)用方法。當(dāng)客戶端在EJB對象上調(diào)用方法時,EJB對象必須選擇一個bean實(shí)例來應(yīng)答。EJB對象可以建立一個新的實(shí)例或是重用已經(jīng)存在的實(shí)例。 ejbObject.add(); 破壞EJB對象 調(diào)用EJB或Home對象上的remove()方法來破壞EJB對象。 ejbObject.remove();