« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
|
公告 |
我近期在研究Maven、Turbine、EJB,如果有朋友想一起交流学习,请加我的MSN:moshco_zhu@hotmail.com!
你为什么来,你何必来,叫我怎么见你!
--《小城之春》 |
| 
|
本站首页 管理页面 写新日志 退出
[01 技术文档]在Weblogic 10中做EJB3的开发 之基础开发 (4) |
在Weblogic 10中做EJB3的开发 之基础开发 (4)
---------------------------------------------------------------------------
3.2 有状态会话Bean的生命周期
其实有状态会话Bean和无状态会话Bean都是有生命周期的,但是,清楚的掌握有状态的会话Bean的生命周期意义更为重要。
@PostConstruct:当bean对象完成实例化后,使用了这个注释的方法会被立即调用。这个注释同时适用于有状态和无状态的会话bean。 @PreDestroy:使用这个注释的方法会在容器从它的对象池中销毁一个无用的或者过期的bean 实例之前调用。这个注释同时适用于有状态和无状态的会话bean。 @PrePassivate:当一个有状态的session bean 实例空闲过长的时间,容器将会钝化(passivate)它,并把它的状态保存在缓存当中。使用这个注释的方法会在容器钝化bean 实例之前调用。这个注释适用于有状态的会话bean。当钝化后,又经过一段时间该bean 仍然没有被操作,容器将会把它从存储介质中删除。以后,任何针对该bean方法的调用容器都会抛出例外。 @PostActivate:当客户端再次使用已经被钝化的有状态session bean 时,新的实例被创建,状态被恢复。使用此注释的session bean 会在bean 的激活完成时调用。这个注释只适用于有状态的会话bean。 @Init:这个注释指定了有状态session bean 初始化的方法。它区别于@PostConstruct 注释在于:多个@Init注释方法可以同时存在于有状态session bean 中,但每个bean 实例只会有一个@Init 注释的方法会被调用。这取决于bean 是如何创建的(细节请看EJB 3.0 规范)。@PostConstruct 在@Init 之后被调用。 另一个有用的生命周期方法注释是@Remove,特别是对于有状态session bean。当应用通过存根对象调用使用了@Remove 注释的方法时,容器就知道在该方法执行完毕后,要把bean 实例从对象池中移走。
下面我们做一个例子来体验一下有状态会话Bean的生命周期!
首先新建一个接口。 文件地址:[EJB3/JavaSource/com/mh/ejb3/test/statefull/TestLifeCycle.java] 报名:[com.mh.ejb3.test.statefull] 名称:[TestLifeCycle] 内容如下: ---------------------------------------------------------------------- /** * */ package com.mh.ejb3.test.statefull;
import java.io.Serializable;
/** * @author moshco zhu * */ public interface TestLifeCycle extends Serializable {
public String sayTest();
public void remove();
} ---------------------------------------------------------------------- 需要注意的就是:有状态会话Bean是需要实现序列化接口的。
创建Bean类。 文件地址:[EJB3/JavaSource/com/mh/ejb3/test/statefull/TestLifeCycleBean.java] 包名:[com.mh.ejb3.test.statefull] 名称:[TestLifeCycleBean] EJB类型:[有状态会话Bean] 实现接口:[远程接口] 内容如下: ---------------------------------------------------------------------- /** * */ package com.mh.ejb3.test.statefull;
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;
/** * @author moshco zhu * */ @SuppressWarnings("serial") @Stateful(mappedName = "TestLifeCycleBean") @Remote(TestLifeCycle.class) public class TestLifeCycleBean implements TestLifeCycle {
@Init public void ejbCreate() {
System.out.println("EJB3测试:有状态会话Bean生命周期,生命周期方法被容器调用:[初始化]。"); }
@PostConstruct public void post() {
System.out.println("EJB3测试:有状态会话Bean生命周期,生命周期方法被容器调用:[初始化后的内容初始化]。");
}
@PrePassivate public void passivate() { System.out.println("EJB3测试:有状态会话Bean生命周期,生命周期方法被容器调用:[EJB处于钝化状态]。"); } @PostActivate public void postActivate() { System.out.println("EJB3测试:有状态会话Bean生命周期,生命周期方法被容器调用:[EJB处于钝化激活状态]。"); }
@Remove public void remove() {
System.out.println("EJB3测试:有状态会话Bean生命周期,生命周期方法被容器调用:[EJB将被删除]。");
}
@PreDestroy public void destroy() { System.out.println("EJB3测试:有状态会话Bean生命周期,生命周期方法被容器调用:[EJB处于销毁状态]。"); }
/* * (非 Javadoc) * * @see com.mh.ejb3.test.statefull.TestLifeCycle#sayTest() */ public String sayTest() {
String strResult = "EJB3测试:有状态会话Bean的生命周期!业务方法被调用了!";
return strResult; }
} ---------------------------------------------------------------------- 这个EJB的JNDI应该是:[TestLifeCycleBean#com.mh.ejb3.test.statefull.TestLifeCycle]。 这里有个地方是要特别注意一下,就是:[@Init]定义的方法的名称在Weblogic中必须是[ejbCreate],而且可以有多个,就像EJB的构造方法一样,容器会通用哪个,是由调用者决定的。
下面写访问的Servlet,打开文件[WebContext/JavaSource/com/mh/servlet/test/CommonSV.java],添加下面一段: ---------------------------------------------------------------------- } else if (strPara != null && strPara.equals("TestLifeCycle")) { // 通过JNDI获取EJB对象 TestLifeCycle test = (TestLifeCycle) getEJBObject("TestLifeCycleBean#com.mh.ejb3.test.statefull.TestLifeCycle"); message += test.sayTest() + "\n<br>"; message += "这是一个关于有状态会话Bean的生命周期的例子!你注意观察控制台!";
// 把会话Bean保存到session中 HttpSession session = request.getSession(true); session.setAttribute("TestLifeCycle", test); } else if (strPara != null && strPara.equals("RemoveTestLifeCycle")) { // 通过JNDI获取EJB对象
// 从session中取出之前的session Bean HttpSession session = request.getSession(true); TestLifeCycle test = (TestLifeCycle) session .getAttribute("TestLifeCycle"); test.remove();
message += "删除有状态会话Bean完成!\n<br>"; message += "这是一个关于有状态会话Bean的生命周期的例子!你注意观察控制台!"; ----------------------------------------------------------------------
在欢迎页面程序[WebContext/index.jsp],加入下面这段: ---------------------------------------------------------------------- <p><center> EJB3测试:有状态会话Bean生命周期的例子<br> <a href="<%=request.getContextPath() %>/sv/CommonSV.do?dowith=TestLifeCycle" target="_blank">创建一个有状态会话Bean</a><br> <a href="<%=request.getContextPath() %>/sv/CommonSV.do?dowith=RemoveTestLifeCycle" target="_blank">删除当前的有状态会话Bean</a><br> </center></p> ----------------------------------------------------------------------
编译发布程序,等一会你就可以看效果了!
如果发布的过程中,你遇到一些奇怪的问题,比如什么不能发布,或者能发布却不能激活,你可以打开你的电脑的任务管理器,看一看有没有一个叫[bea...](后面部分不记得了)的进程,把它Kill,问题就解决了!这个是花费了我近2天的时间才发现的。
weblogic中,一个有状态会话Bean对象在容器中如果10分钟不被使用,它会被容器放人硬盘缓存,处于钝化状态;如果再过一段时间不被使用,它会被容器容器删除;如果中间有调用,它就会激活。
|
阅读全文(3232) | 回复(0) | 编辑 | 精华 |
|