有状态会话Bean
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Leabharlann Baidu
(2)无状态会话Bean重点用于服务性算法,这
种算法和调用的时间与地点无关,多数情况下 多个客户可以共用一个EJB组件对象,当一个 用户释放对特定组件的引用后,该组件通常被 缓存,以便以后使用;而有状态EJB组件则用于 需要维持状态的业务,如购物车,计数器等,不 同客户通过不同EJB组件对象进行操作,当用 户释放对特定EJB组件对象的引用后,该组件 对象往往被销毁,而不会被缓存.
编号 4 5 6 7 8
名称 STATUS_NO_TRANSACTION STATUS_PREPARED STATUS_PREPARING STATUS_ROLLING_BACK STATUS_UNKNOWN
介绍 事务没有被关联到UserTransaction 对象 事务已经被被关联到 UserTransaction对象 一个处于初始准备阶段的事务被关联 到了UserTransaction对象 事务处于回滚状态 事务对象状态不确定
Bean类
/*01*/package EJB; /*02*/import javax.ejb.*; /*03*/@Stateful(mappedName="statefulCount") /*04*/public class CounterBean implements Counter /*05*/ { /*06*/int count=0; /*07*/ public int add() /*08*/ { /*09*/ this.count++; /*10*/ return this.count; /*11*/ } /*12*/ public int delete() /*13*/ { /*14*/ this.count--; /*15*/ return this.count; /*16*/ } /*17*/ public int getInt() /*18*/ { /*19*/ return this.count; /*20*/ } /*21*/}
事务已经被提交时的 UserTransaction对象状态 事务正在提交时的UserTransaction 对象状态 事务被标注为回滚时的 UserTransaction对象状态
1 2 3
STATUS_COMMITTED STATUS_COMMITTING STATUS_MARKED_ROLLBACK
7.5 有状态会话Bean生命周期事件
PrePassivate
当一个处于活动状态的有状态EJB对象长时间
不使用是,EJB服务器通常会将该组件对象切 换到休眠状态(钝化)。EJB组件休眠的本质 是将EJB组件对象的状态和当前环境状态统一 保存起来,然后将对象从内存中删除。 在EJB组件由活动状态被转变到休眠状态时, EJB服务器会触发PrePassivate。在该方法中 可以对一些休眠前的状态进行保存。
时启动事务,方法结束时终止事务。 任何情况下,有状态会话Bean的对象只能处 于一个事务环境中,对处于事务中的有状态 会话EJB对象,进行新的事务请求将会导致 异常产生。
EJB3.0提供了接口SessionSynchronization用来处理有状态
会话Bean启动事务和终止事务对应的事件。 有状态会话EJB事务处理事件 事务开始事件:void afterBegin() 开始一个事务时该方法被调用 事务提交事件:void beforeCompletion() 当事务被成功提交时触发该事件 事务结束事件:void afterCompletion(boolean rst) 无论是提交还是回滚,都会触发该事件。如果成功,rst的 值为true;如果回滚,rst的值为false
7.7 有状态会话Bean事务
由于有状态会话Bean和客户间有一一对应关
系,一个客户在整个使用过程中都由一个确 定EJB对象为其提供服务,而且客户控制了组 件的生命周期。因此存在事务从一个方法开 始,在另一个方法中提交或回滚的情况。
7.7.1 CMT类型的有状态会话Bean
默认情况下,事务以方法为范围,方法开始
7.2 有状态会话Bean实例
开发一个计数功能程序,通过该组件可以对
窗口上按钮单击次数进行计数。 包含两个文件
业务接口 会话Bean类
业务接口Counter
/*01*/package EJB; /*02*/import javax.ejb.*; /*03*/@Remote /*04*/public interface Counter /*05*/{ /*06*/ public int getInt() ; /*07*/ public int add() ; /*08*/ public int delete() ; /*09*/}
7.4 与无状态会话Bean区别
(2)组件对象在休眠状态或缓存状态的差别
当无状态EJB组件进入缓存状态后,其对应 的对象在服务器上还存在;而有状态EJB组件 对象进入休眠状态后,其EJB组件对象往往被 销毁,只是其对象状态被有效的保存到了硬 盘或数据库中。
7.4 与无状态会话Bean区别
(3)组件对象进入休眠或(缓存状态)时, EJB服务器所保留的组件数据 无状态EJB组件对象进入缓存状态后,其被保留 的是其组件上下文环境(Context);而有状 态EJB进入休眠状态后被保存的不但是EJB组 件的Context,而且包括EJB组件的各种属性 状态。
可以实现事务在一个方法中启动,在其他方
法中结束的行为。 这种操作在实际项目开发中具有重要的意义, 例如购物车的实现,购物车生成时启动事务, 购物车结束时终止事务,在用户使用购物车 的整个过程中都对应了一个唯一事务。
编号
名称
介绍
0
STATUS_ACTIVE
事务开始到事务提交或回滚间的 UserTransaction对象状态,包括事 务被暂停状态
7.5 有状态会话Bean生命周期事件
PreDestroy
当组件对象在活动状态或休眠状态时,客户端可以
通过调用组件的Remove方法实现组件对象的销毁; 在另一种情况下,活动状态下的有状态EJB组件超过 其寿命,服务器也会销毁该EJB组件,将该组件对象 由活动状态转变为不存在状态。 当有状态EJB组件被销毁前,EJB服务器会触发组件 上的PreDestroy事件。 PreDestroy是组件整个生命周期中,最后执行的行 为,在方法中可以对组件用过的资源进行释放。
在CMT中有2种方法回滚事务。第一种,系统
异常抛出,容器自动回滚事务;第二种调用 EJBContext 接口的setRollbackOnly方法, bean方法就会通知容器回滚事务。如果bean 抛出业务异常,除非调用setRollbackOnly, 否则容器不会自动回滚事务。
7.7.2 BMT类型的有状态会话Bean
7.2.5 客户端访问过程 与无状态会话Bean的访问过程相同
7.3 有状态会话Bean的生命周期
不存在状态 1、创建 2、逻辑操作 5.销毁 超时
3.休眠 活动状态
休眠状态 4.激活
有状态会话Bean的生命周期
第一步:客户端向EJB服务器请求一个组件引用时,EJB服务器 创建EJB组件对象; 第二步:通过EJB组件的对象接口,在EJB组件上执行相应的逻 辑操作; 第三步:EJB服务器会随时检查EJB组件的执行情况,通常会将 不经常使用的EJB组件对象序列化,序列化后的EJB组件对象 其实已经不存在,但逻辑上可以看作其处于休眠状态。 第四步:当客户重新请求某个EJB组件时,EJB服务器会将EJB 组件激活,在此过程中要加载与客户调用相对应的状态信息, 从而保证EJB组件的状态得到维持; 第五步:当用户调用remove方法和EJB服务器调用组件的 remove方法时,相应的EJB组件就被销毁。EJB组件在休眠状 态下超时,将会返回到不存在状态。
第7章 有状态会话Bean
JavaEE5 教程 吉林大学软件学院
主要内容
有状态会话Bean概念
有状态会话Bean实例
有状态会话Bean的生命周期
有状态会话Bean生命周期事件
有状态会话Bean事务
7.1 有状态会话Bean概念
有状态会话Bean的含义:
在客户端引用期间维护Bean中的所有实例数据的状态值, 这些数据在引用期间可以被其他方法所引用,其他客户不 会共享同一个Session Bean的实例。 有状态会话Bean的特点: 1)保存客户端的状态,维持和客户端的对话状态 2)和客户端的关系是一对一的关系 3)需要的系统资源相对更多 4)执行速度相对更慢
7.6 生命事件处理
2 配置文件
通过在ejb-jar.xml文件定义EJB组件生命周
期事件处理方法
<enterprise-beans> <session> <ejb-name>HelloWorldBean1</ejb-name> <post-construct> <lifecycle-callback-method>initComp</lifecycle-callbackmethod> </post-construct> <pre-passivate> <lifecycle-callback-method>prePassivate</lifecycle-callbackmethod> </pre-passivate> <post-activate> <lifecycle-callback-method>PostActivate</lifecycle-callbackmethod> </post-activate> <pre-destroy> <lifecycle-callback-method>endclass</lifecycle-callbackmethod> </pre-destroy> </session> <session> <ejb-name>HelloWorldBean</ejb-name> </session> </enterprise-beans>
7.5 有状态会话Bean生命周期事件
PostActive
当EJB组件由休眠状态切换到活动状态后,会
马上触发EJB组件上的PostActive事件。在该 方法中可以对EJB组件中的状态进行一些休眠 后的恢复工作。
7.6 生命事件处理
1 标注方法 @PostConstruct @PreDestroy @PrePassivate @PostActive
7.1 有状态会话Bean概念
有状态和无状态会话bean的本质区别 (1)生命期 有状态会话bean :每个用户有自己特有的一个
实例,在用户的生存期内,bean保持了用户的信息, 即“有状态”;一旦用户灭亡(调用结束或实例结 束),bean的生命期也告结束。即每个用户最初都 会得到一个初始的bean。 无状态会话bean :bean一旦实例化就被加进会 话池中,各个用户都可以共用。即使用户已经消亡, bean 的生命期也不一定结束,它可能依然存在于会 话池中,供其他用户调用。由于没有特定的用户, 那么也就不能保持某一用户的状态,所以叫无状态 bean
7.4 与无状态会话Bean区别
(1)组件对象进入休眠(缓存状态)的时刻 (2)组件对象在休眠状态或缓存状态的差别 (3)组件对象进入休眠或(缓存状态)时, EJB服务器所保留的组件数据
7.4 与无状态会话Bean区别
(1)组件对象进入休眠(缓存状态)的时刻 有状态EJB组件进入休眠状态,通常是因为对应 的组件对象长时间不被使用,或服务器负载 十分重的情况下,才会发生;而无状态EJB组 件在一个业务方法执行完毕后就会被释放到 无状态EJB的缓冲池中。
7.5 有状态会话Bean生命周期事件
PostConstruct
PreDestroy
PrePassivate PostActive
(1)PostConstruct
当用户第一次调用某个有状态EJB组件时,
EJB服务器会调用组件上的newInstance()方 法创建一个EJB组件对象。EJB服务器会对EJB 组件的各种成员变量进行初始化设置,并触 发组件的PostConstruct事件。
(2)无状态会话Bean重点用于服务性算法,这
种算法和调用的时间与地点无关,多数情况下 多个客户可以共用一个EJB组件对象,当一个 用户释放对特定组件的引用后,该组件通常被 缓存,以便以后使用;而有状态EJB组件则用于 需要维持状态的业务,如购物车,计数器等,不 同客户通过不同EJB组件对象进行操作,当用 户释放对特定EJB组件对象的引用后,该组件 对象往往被销毁,而不会被缓存.
编号 4 5 6 7 8
名称 STATUS_NO_TRANSACTION STATUS_PREPARED STATUS_PREPARING STATUS_ROLLING_BACK STATUS_UNKNOWN
介绍 事务没有被关联到UserTransaction 对象 事务已经被被关联到 UserTransaction对象 一个处于初始准备阶段的事务被关联 到了UserTransaction对象 事务处于回滚状态 事务对象状态不确定
Bean类
/*01*/package EJB; /*02*/import javax.ejb.*; /*03*/@Stateful(mappedName="statefulCount") /*04*/public class CounterBean implements Counter /*05*/ { /*06*/int count=0; /*07*/ public int add() /*08*/ { /*09*/ this.count++; /*10*/ return this.count; /*11*/ } /*12*/ public int delete() /*13*/ { /*14*/ this.count--; /*15*/ return this.count; /*16*/ } /*17*/ public int getInt() /*18*/ { /*19*/ return this.count; /*20*/ } /*21*/}
事务已经被提交时的 UserTransaction对象状态 事务正在提交时的UserTransaction 对象状态 事务被标注为回滚时的 UserTransaction对象状态
1 2 3
STATUS_COMMITTED STATUS_COMMITTING STATUS_MARKED_ROLLBACK
7.5 有状态会话Bean生命周期事件
PrePassivate
当一个处于活动状态的有状态EJB对象长时间
不使用是,EJB服务器通常会将该组件对象切 换到休眠状态(钝化)。EJB组件休眠的本质 是将EJB组件对象的状态和当前环境状态统一 保存起来,然后将对象从内存中删除。 在EJB组件由活动状态被转变到休眠状态时, EJB服务器会触发PrePassivate。在该方法中 可以对一些休眠前的状态进行保存。
时启动事务,方法结束时终止事务。 任何情况下,有状态会话Bean的对象只能处 于一个事务环境中,对处于事务中的有状态 会话EJB对象,进行新的事务请求将会导致 异常产生。
EJB3.0提供了接口SessionSynchronization用来处理有状态
会话Bean启动事务和终止事务对应的事件。 有状态会话EJB事务处理事件 事务开始事件:void afterBegin() 开始一个事务时该方法被调用 事务提交事件:void beforeCompletion() 当事务被成功提交时触发该事件 事务结束事件:void afterCompletion(boolean rst) 无论是提交还是回滚,都会触发该事件。如果成功,rst的 值为true;如果回滚,rst的值为false
7.7 有状态会话Bean事务
由于有状态会话Bean和客户间有一一对应关
系,一个客户在整个使用过程中都由一个确 定EJB对象为其提供服务,而且客户控制了组 件的生命周期。因此存在事务从一个方法开 始,在另一个方法中提交或回滚的情况。
7.7.1 CMT类型的有状态会话Bean
默认情况下,事务以方法为范围,方法开始
7.2 有状态会话Bean实例
开发一个计数功能程序,通过该组件可以对
窗口上按钮单击次数进行计数。 包含两个文件
业务接口 会话Bean类
业务接口Counter
/*01*/package EJB; /*02*/import javax.ejb.*; /*03*/@Remote /*04*/public interface Counter /*05*/{ /*06*/ public int getInt() ; /*07*/ public int add() ; /*08*/ public int delete() ; /*09*/}
7.4 与无状态会话Bean区别
(2)组件对象在休眠状态或缓存状态的差别
当无状态EJB组件进入缓存状态后,其对应 的对象在服务器上还存在;而有状态EJB组件 对象进入休眠状态后,其EJB组件对象往往被 销毁,只是其对象状态被有效的保存到了硬 盘或数据库中。
7.4 与无状态会话Bean区别
(3)组件对象进入休眠或(缓存状态)时, EJB服务器所保留的组件数据 无状态EJB组件对象进入缓存状态后,其被保留 的是其组件上下文环境(Context);而有状 态EJB进入休眠状态后被保存的不但是EJB组 件的Context,而且包括EJB组件的各种属性 状态。
可以实现事务在一个方法中启动,在其他方
法中结束的行为。 这种操作在实际项目开发中具有重要的意义, 例如购物车的实现,购物车生成时启动事务, 购物车结束时终止事务,在用户使用购物车 的整个过程中都对应了一个唯一事务。
编号
名称
介绍
0
STATUS_ACTIVE
事务开始到事务提交或回滚间的 UserTransaction对象状态,包括事 务被暂停状态
7.5 有状态会话Bean生命周期事件
PreDestroy
当组件对象在活动状态或休眠状态时,客户端可以
通过调用组件的Remove方法实现组件对象的销毁; 在另一种情况下,活动状态下的有状态EJB组件超过 其寿命,服务器也会销毁该EJB组件,将该组件对象 由活动状态转变为不存在状态。 当有状态EJB组件被销毁前,EJB服务器会触发组件 上的PreDestroy事件。 PreDestroy是组件整个生命周期中,最后执行的行 为,在方法中可以对组件用过的资源进行释放。
在CMT中有2种方法回滚事务。第一种,系统
异常抛出,容器自动回滚事务;第二种调用 EJBContext 接口的setRollbackOnly方法, bean方法就会通知容器回滚事务。如果bean 抛出业务异常,除非调用setRollbackOnly, 否则容器不会自动回滚事务。
7.7.2 BMT类型的有状态会话Bean
7.2.5 客户端访问过程 与无状态会话Bean的访问过程相同
7.3 有状态会话Bean的生命周期
不存在状态 1、创建 2、逻辑操作 5.销毁 超时
3.休眠 活动状态
休眠状态 4.激活
有状态会话Bean的生命周期
第一步:客户端向EJB服务器请求一个组件引用时,EJB服务器 创建EJB组件对象; 第二步:通过EJB组件的对象接口,在EJB组件上执行相应的逻 辑操作; 第三步:EJB服务器会随时检查EJB组件的执行情况,通常会将 不经常使用的EJB组件对象序列化,序列化后的EJB组件对象 其实已经不存在,但逻辑上可以看作其处于休眠状态。 第四步:当客户重新请求某个EJB组件时,EJB服务器会将EJB 组件激活,在此过程中要加载与客户调用相对应的状态信息, 从而保证EJB组件的状态得到维持; 第五步:当用户调用remove方法和EJB服务器调用组件的 remove方法时,相应的EJB组件就被销毁。EJB组件在休眠状 态下超时,将会返回到不存在状态。
第7章 有状态会话Bean
JavaEE5 教程 吉林大学软件学院
主要内容
有状态会话Bean概念
有状态会话Bean实例
有状态会话Bean的生命周期
有状态会话Bean生命周期事件
有状态会话Bean事务
7.1 有状态会话Bean概念
有状态会话Bean的含义:
在客户端引用期间维护Bean中的所有实例数据的状态值, 这些数据在引用期间可以被其他方法所引用,其他客户不 会共享同一个Session Bean的实例。 有状态会话Bean的特点: 1)保存客户端的状态,维持和客户端的对话状态 2)和客户端的关系是一对一的关系 3)需要的系统资源相对更多 4)执行速度相对更慢
7.6 生命事件处理
2 配置文件
通过在ejb-jar.xml文件定义EJB组件生命周
期事件处理方法
<enterprise-beans> <session> <ejb-name>HelloWorldBean1</ejb-name> <post-construct> <lifecycle-callback-method>initComp</lifecycle-callbackmethod> </post-construct> <pre-passivate> <lifecycle-callback-method>prePassivate</lifecycle-callbackmethod> </pre-passivate> <post-activate> <lifecycle-callback-method>PostActivate</lifecycle-callbackmethod> </post-activate> <pre-destroy> <lifecycle-callback-method>endclass</lifecycle-callbackmethod> </pre-destroy> </session> <session> <ejb-name>HelloWorldBean</ejb-name> </session> </enterprise-beans>
7.5 有状态会话Bean生命周期事件
PostActive
当EJB组件由休眠状态切换到活动状态后,会
马上触发EJB组件上的PostActive事件。在该 方法中可以对EJB组件中的状态进行一些休眠 后的恢复工作。
7.6 生命事件处理
1 标注方法 @PostConstruct @PreDestroy @PrePassivate @PostActive
7.1 有状态会话Bean概念
有状态和无状态会话bean的本质区别 (1)生命期 有状态会话bean :每个用户有自己特有的一个
实例,在用户的生存期内,bean保持了用户的信息, 即“有状态”;一旦用户灭亡(调用结束或实例结 束),bean的生命期也告结束。即每个用户最初都 会得到一个初始的bean。 无状态会话bean :bean一旦实例化就被加进会 话池中,各个用户都可以共用。即使用户已经消亡, bean 的生命期也不一定结束,它可能依然存在于会 话池中,供其他用户调用。由于没有特定的用户, 那么也就不能保持某一用户的状态,所以叫无状态 bean
7.4 与无状态会话Bean区别
(1)组件对象进入休眠(缓存状态)的时刻 (2)组件对象在休眠状态或缓存状态的差别 (3)组件对象进入休眠或(缓存状态)时, EJB服务器所保留的组件数据
7.4 与无状态会话Bean区别
(1)组件对象进入休眠(缓存状态)的时刻 有状态EJB组件进入休眠状态,通常是因为对应 的组件对象长时间不被使用,或服务器负载 十分重的情况下,才会发生;而无状态EJB组 件在一个业务方法执行完毕后就会被释放到 无状态EJB的缓冲池中。
7.5 有状态会话Bean生命周期事件
PostConstruct
PreDestroy
PrePassivate PostActive
(1)PostConstruct
当用户第一次调用某个有状态EJB组件时,
EJB服务器会调用组件上的newInstance()方 法创建一个EJB组件对象。EJB服务器会对EJB 组件的各种成员变量进行初始化设置,并触 发组件的PostConstruct事件。