Session Bean的生命週期事件 Session bean的生命週期裏,狀態變化會觸發生命週期時間的發生。如從 does not exist 狀態進入methods – ready pool狀態會觸發@Postconstruct事件。同樣從methods-ready pool狀態進入does not exist 狀態也會觸發@PreDestroy事件。 有些時候,你需要定製sessin bean 的管理過程。例如:你可能想在創建session bean實例的時候初始化字段變量,或在bean實例被銷燬的時候關掉外部資源。上述這些,你都可能通過在bean類定義生命週期的回調方法來實現。這些方法指定爲回調方法,這不同與EJB2.1,所有的回調方法必須實現,即使是空的。在EJB3.0,bean可以有任意數量,任意名字的回調方法。 •@PostConstruct: 當bean對象完成實例化後,標註了這個註釋的方法會被立即調用,每個bean class只能定義一個@PostConstruct方法。這個註釋同時適用於有狀態和無狀態會話bean。 •@PreDestroy:標註了這個註釋的方法會在容器銷燬一個無用的或者過期的bean實例之前調用。這個註釋同時適用於有狀態和無狀態會話bean。 •@PrePassivate: 當一個有狀態的bean實例空閒時間過長,就會發生鈍化(passivate)。標註了這個註釋的方法會在鈍化之前被調用。Bean實例被鈍化後,在一段事件內,如果仍然沒有用戶對bean實例進行操作,容器將會從硬盤中刪除它。以後,任何針對該ben方法的調用,容器都會拋出例外。這個註釋適用於有狀態會話bean。 •@PostActivate:當客戶端再次使用已經被鈍化的有狀態bean時,EJB容器會重新實例化一個Bean實例,並從硬盤中將之前的狀態恢復。標註了這個註釋的方法會在激活完成時被調用。這個註釋只使用於有狀態會話bean。 •@Init:這個註釋指定了有狀態bena初始化的方法,它區別於@PostConstruct註釋在於:多個@Init註釋方法可以同時存在於有狀態session bean 中,但每個bean實例只會有一個@Init註釋的方法會被調用。@PostConstruct在@Init之後調用。 •Remove:當客戶端調用標註了@Remove註釋的方法時,容器將會在方法執行結束後把Bean實例刪除。 要處理這些生命週期事件,我們可以爲這些事件註冊一個回調方法,回調方法可以使用任何名稱。但是它必須返回void,不帶參數,且不能拋出任何checked exception 。事件註冊的過程很簡單,只需在回調方法上面加上事件的註釋就可以了。 測試一下例子: Lifecycle.java package com.foshanshop.ejb3; /** * 業務接口 * * @author Administrator * */ public interface Lifecycle { public String say(); public void stopSession(); } LifecycleBean.java package com.foshanshop.ejb3Impl; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.ejb.Init; import javax.ejb.PostActivate; import javax.ejb.PrePassivate; import javax.ejb.Remote; import javax.ejb.Remove; import javax.ejb.Stateful; import org.hibernate.validator.Range; import com.foshanshop.ejb3.Lifecycle; @Stateful @Remote(Lifecycle.class) public class LifecycleBean implements Lifecycle { @Override public String say() { try{ Thread.sleep(1000*10); } catch(InterruptedException e){ e.printStackTrace(); } return "這是會話Bean生命週期應用例子"; } @Init public void initialize(){ System.out.println("@Init事件觸發"); } @PostConstruct public void Construce(){ System.out.println("@PostConstruce事件觸發"); } @PreDestroy public void exit(){ System.out.println("@PreDestroy事件觸發"); //調用該方法以通知容器,移除該bean實例,終止會話。方法體可以是空的 } @PrePassivate public void serialize(){ System.out.println("@PrePassivate事件觸發"); //鈍化 } @PostActivate public void activate(){ System.out.println("@PostActivate事件觸發"); } @Remove public void stopSession(){ System.out.println("@Remove事件觸發"); } } 業務實現後將進行打包,之後創建LifecycleTest.jsp。如下: <%@ page language="java" pageEncoding="UTF-8"import="java.util.*,javax.naming.*,com.foshanshop.ejb3.*"%> <% try{ Lifecycle lifecycle = (Lifecycle) session.getAttribute("lifecycle"); if(lifecycle == null){ InitialContext ctx = new InitialContext(); lifecycle = (Lifecycle) ctx.lookup("LifecycleBean/remote"); session.setAttribute("lifecycle",lifecycle); } out.println(lifecycle.say()); out.println("<br>請注意觀察Jboss控制檯輸出,等待10分鐘,"+ "容器將會鈍化此會話Bean,@Passivate註釋的方法將會執行<br>"); out.println("<font color=red>你可以調用stopSession方法把會話Bean實例刪除。"+ "在刪除會話Bean時,將觸發@PreDestroy事件</font>"); } catch(Exception e) { out.println(e.getMessage()); } %> 使用build.xml文件對web目錄下的文件進行打包。(build.xml要放到WebRoot目錄下), 如下面的目錄結構。 Build.xml: <?xml version="1.0"?> <project name="war" default="war" basedir="."> <target name="war" description="創建WEB發佈包"> <war warfile="${basedir}/my.war" webxml="${basedir}/WEB-INF/web.xml"> <fileset dir="${basedir}"> <include name="**"/> <exclude name="build.xml" /> <exclude name="/WEB-INF/web.xml" /> </fileset> </war> </target> </project> 打包OK後,扔到jboss服務run.bat。觀看輸出結果。
當公司網絡外部的用戶需要訪問你編寫的應用程序或受保護的資源時,很多Java程序員爲他們的應用程序創建自己的安全模塊。大多數這些模塊都是針對具體的應用程序,這樣在下一個應用程序需要安全保護時,程序員又重新開始所有工作。構建自己的安全模塊的另
下面例子在session bean 中定義了一個定時器,定時器每個3秒鐘觸發一次事件,當定時事件觸發次數超過5次的時候便終止定時器的執行。 1. TimerServiceDao.java (接口) package com.foshan
執行HelloClient客戶端程序 1. 出現Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class:
Jboss學習筆記 運行步驟: 將項目src那一塊打包成爲HelloWorld.jar (使用eclipse中自帶的打包工具)然後把該文件拷貝到jboss安裝目錄/server/default/deploy/目錄下,然後在C:/jb
學習筆記: 下面是Ejb3.0 jboss4.2 MySql 的 有關配置的一些操作方式: 1. 手動創建數據庫如:foshanshop 2. 手動配置jboss連接jndi。如果jboss版本中有mysql-ds.xml(目錄
EJB 與 Jboss : 1. main方法調用遠程數據:(操作步驟) begin a:創建project b:找到jboss安裝目錄下的client文件,複製該文件下的所有jar。添加到工程中 c: 添加下列的所有程序(將以下代碼)