7.有状态会话

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

客户端


CountClient.java
建立应用程序客户端 目的:
1. 2.
调用Bean 配置容器,强迫其钝化Bean。
释放资源
@PrePassivate
ห้องสมุดไป่ตู้
@PostActivate
激活之后
未使用
获得资源
@PreDestroy
结束对@Remove方法 的调用后,销毁 Bean之前。
释放资源
释放资源
CountBean示例
远程业务接口 public interface Count { public int count(); //加1 public void set(int val); //置位 public void remove(); //删除 } 客户请求将数量加1。客户多次调用。

实现类
@Stateful @Remote(Count.class) @Interceptors(CountCallbacks.class) public class CountBean implements Count { private int val; public int count() { System.out.println("count()"); return ++val; }

维护状态会话的规则
挂起实例时,容器借助于对象序列化将会话状 态转换成二进制blob,写入到硬盘。因此,状 态信息转移到持久化源中。 会话状态的组成部分:

• 非transient的原始类型;非transient的Java对象 类型。 • 持有的对容器实现对象的引用。本地或远程业务接 口的引用,Home对象的引用;JNDI命名上下文; SessionContext对象。
回调接口

@Prepassivate

此方法调用后,Bean将被交换到外存。 在J2EE中,通过预定义方法签名实现。
@Stateful public class MyBean{ @Prepassivate public void passivate(){ //释放Socket连接等 } }
@PostActivate 恢复内存状态,恢复释放的连接 @Stateful public class MyBean{ @PostActivate public void activate(){ //打开Socket,数据库连接等 } }
有状态会话Bean





当客户调用Bean方法时,客户将启动与企业会话 Bean的会话.其状态必须保存下来,供同一个客户 下次使用. 如果持有大量会话资源,服务器将不堪承受. 为了限制内存中会话Bean的数量,将其保存到磁 盘,称为Passivation。 当再次调用时Activation。 最近最少使用策略。 只有客户请求到来时才激活有态Bean实例。
变量val是可序列化的,挂起、激活期间容 器自动保存其值。 客户调用remove()方法后,此EJB实例不 再需要,可销毁。

拦截器
public class CountCallbacks { public CountCallbacks() {} @PostConstruct public void construct(InvocationContext ctx) throws Exception { System.out.println("cb:construct() "); ctx.proceed(); } @PostActivate public void activate(InvocationContext ctx) throws Exception { System.out.println("cb:activate()"); ctx.proceed(); }


EJB 3.0 拦截器使 bean 开发人员能够对方法 调用流进行细粒度控制。可以在无状态会话 bean、有状态会话 bean 和消息驱动 bean 上使用它们。拦截器可以是同一 bean 类中的方 法或是一个外部类。 Bean 开发人员可以使用拦截器:


在参数传递至 bean 之前对其进行修改 修改从 bean 返回的值 捕获和处理方法异常 完全中断调用(适用于本地安全框架) 提供方法监测

除非要在EJB中打开资源,否则不必提供 回调方法。 可以为Bean类提供单个或多个回调监听器 类(拦截器)。

生命周期回调
注释
@PostConstruct
描述
在实例化Bean类 后 挂起之前
无状态
有状态
根据Bean实例 根据Bean实例 要求初始化, 要求初始化, 如成员变量。 如成员变量 未使用
@PrePassivate public void passivate(InvocationContext ctx) throws Exception { System.out.println("cb:passivate()"); ctx.proceed(); } @PreDestroy public void destroy(InvocationContext ctx) throws Exception { System.out.println("cb:destroy()"); ctx.proceed(); } }
生命周期 的回调
public void set(int val) { this.val = val; System.out.println("set()"); }
@Remove public void remove() { System.out.println("remove()"); } }
拦截
相关文档
最新文档