第8章 Session EJB技术.ppt_第1页
第8章 Session EJB技术.ppt_第2页
第8章 Session EJB技术.ppt_第3页
第8章 Session EJB技术.ppt_第4页
第8章 Session EJB技术.ppt_第5页
已阅读5页,还剩31页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第8章 Session EJB技术,8.1 Session EJB的生命周期,8.2 Session Bean的类型,8.3 状态会话Bean的特征,Session Bean:能够完成客户所要求的业务操作。 作为业务过程对象,会话Bean能够实现业务逻辑、业务规则、算法、工作流等: 订单登记、银行事务、股票交易等,8.1 Session EJB的生命周期,Session EJB与Entity EJB的区别之一:生命周期,Session EJB生命周期短,其生命周期与客户端的会话周期相当。,例如:客户端程序调用会话Bean来完成订单登记,则EJB容器需要完成会话Bean组件实例的创建。在后续操作

2、中,如果客户不再与该实例交互,应用程序有可能会销毁它。,客户端会话时间的长短决定了一个会话Bean使用的长短。 如果客户超时,EJB容器将销毁会话Bean实例。 如果客户使用某会话Bean实例持续了10分钟,则该会话Bean实例有可能存活几分钟或几小时。但不会是几周、几个月 或几年。,会话Bean仅仅是内存对象,一旦其生存的周边环境遭到破坏,会话Bean也将不复存在。 例如:一旦应用服务器瘫痪,会话Bean实例也应该不复存在。,实体Bean是持久性对象,因此实体Bean能够存活数月或数年。 实体Bean是永久性存储器(RDBMS)的一部分。借助于RDBMS能够在内存中构建实体Bean,并且能够

3、存活很长时间。,会话Bean并不是持久化的,因此 会话Bean并不会保存到持久化存储器中。 会话Bean能够操作RDBMS,但是其本身并不是持久性对象。,8.2 Session Bean的类型,会话(Conversation)指客户同EJB组件的交互。它由客户和EJB组件间的多次方法调用构成。 会话Bean类型:有状态会话Bean、无状态会话Bean.,8.2.1有状态会话Bean 一些商务过程本身就是一个包含很多请求而且持续很久的对话。 例如1:电子商务网站购物。 购物过程中,用户可以向购物车内添加物品。用户每添加一个物品,就执行一次请求。 这样的商务过程决定了组件必须跟踪每一次请求时的用户

4、状态(如购物车状态)。 例如2:银行系统。 EJB组件开发者需要在代码中给出银行出纳员处理客户请求的逻辑:查询账户余额、现金储蓄、取钱等,而处理请求的持续时间可能会较长。,其服务的业务过程能够延伸到多个方法请求或者事务中,为完成这种业务过程, 有状态会话Bean需要为单个客户保存状态信息。 如果在方法调用期间有状态会话Bean的状态发生改变,则这种改变必须反映到同一个客户的随后调用中。,8.2.2无状态会话Bean 有些商务过程只需要一次请求对话,这种单一请求的商务过程不需要在方法调用过程中保持状态。 无状态会话Bean只能保留单一对话内容,它们没有状态是因为它们不与客户端程序进行多方法对话。

5、在每一个方法调用后,容器可能会选择销毁这个无状态会话Bean,或者重新生成一个,这样就清除了所有与过去的调用相关的信息。当然,容器可以能选择保存实例,这样所有想使用这个会话Bean的客户端程序都可以重用它。具体的算法依据容器不同而不同。,如果一个Bean的一次对话只持续单一的方法调用,该Bean就叫无状态会话Bean(Stateless Session Bean),之所以称为无状态是因为这些Bean并不保存与客户端的多方法调用。每次方法调用后,无状态会话Bean就清除属于前次方法调用的信息。无状态会话Bean并不保存方法之间的对话状态。 为了使无状态会话Bean对客户端程序有用,客户端程序必须

6、将Bean需要的所有客户数据作为参数传递给商务逻辑方法。以后,Bean可以从诸如数据库中检索需要的数据。 无状态会话Bean可以保持不与任何特定客户相关的状态,例如所有客户端程序都会用到的数据库连接。,例如:信用卡验证组件: 验证组件以卡号、截止日期、姓名、金额作为输入,然后执行验证逻辑,最后将返回一个 是或者否的答案。一旦这个Bean完成了它的任务,其它的客户端程序就可以利用它了,而且 它不保存任何原先的客户信息。,无状态会话Bean不保存任何对话状态,所以可以为任何客户端程序请求服务。实际上,无状态会话Bean可以被存储在调度池内,被重用和在客户端程序之间交换。,8.3 状态会话Bean的

7、特征,8.3.1 对状态会话Bean实现调度池调度,资源有限 应用程序使用的内存比物理内存还大? OS执行程序:使用硬盘作为物理内存的扩展 当一应用程序闲置时,其占用的物理内存与硬盘扩充的内存相互交换; 当某一应用程序重新激活时,所需的数据就从硬盘扩充的内存交换至物理内存。,钝化(passivation):为了限制会话Bean实例在内存中的数量, EJB容器将状态会话Bean交换出去,其对话状态保存在硬盘或其它存储器中,这种做法称为钝化。,激活(activation):当被钝化Bean的原先的客户端对其触发方法进行调用时,被钝化的对话状态重新交换给Bean,这种做法称为激活。 注意,接收激活状

8、态的Bean可能不是原先的Bean实例。但是,没关系,因为新的Bean实例从原先的Bean实例钝化时的那一点重新开始对话。,当有很多客户端调用时,内存中也只能有有限的几个Bean实例,而且调度池调度是有代价的,钝化过程可能导致I/O瓶颈。 而无状态会话Bean无需保存状态,Bean的调度池调度非常容易。,EJB容器决定哪个Bean被激活?哪个Bean被钝化?EJB容器不同,答案也不同。 大多数容器:最近最少被使用(Least Recently Used:LRU)钝化策略。 只要Bean没有被调用,钝化随时都可能发生。 什么时候钝化完全由容器决定。 例外:参与事务处理的Bean只有等到事务处理完

9、毕后才能被钝化。,大多数容器采取Just-In-Time策略激活 Bean. Bean根据需要被激活,即当客户有请求时才发生。,一般而言,钝化和激活对无状态会话Bean没有用处。 无状态会话Bean没有状态被钝化或激活,因此,无状态会话Bean可被EJB容器随意地从内存中清除。,8.3.2 对状态会话Bean遵从的规则 遵从Java对象序列化(Java Object Serialization)所规定的原则,当EJB容器钝化Bean时,它使用对象序列化将Bean的对话状态转换成比特串(bit-block),写入硬盘,这样,状态被安全地保存起来。Bean实例(仍然存在)可以被重新分配给另外一个用

10、户,并且与一个客户端程序开始一个全新的对话交互。,激活过程则相反,写入硬盘的序列化块被读回内存,转换成存储在内存中的Bean数据。,这些能实现是因为javax.ejb.EnterpriseBean接口扩展了java.io.Serializable,而且每个EJB类都间接地实现了该接口。,如果满足以下两点,Bean的每个成员变量都被认为是Bean对话状态的一部分: 1 成员变量是非transient 的基本类型(primitive) 2 成员变量是非transient 的java对象(扩展java.lang.Object),Bean还可能持有容器实现的对象的引用。容器必须在钝化/激活时保存以下内

11、容: 1 EJB对象的引用 2 Home对象的引用 3 EJB上下文的引用 4 JNDI命名上下文,激活/钝化方法 激活/钝化过程中发生了什么? 当EJB容器钝化Bean时,它将Bean的对话状态写进硬盘:文件或数据库。EJB容器通知Bean它将调用Bean必需的方法ejbPassive(),以执行钝化操作。ejbPassive()方法预先告知Bean,它所保留的对话状态即将被交换出去。,EJB容器使用ejbPassive()方法通知Bean:它让Bean释放所占用的资源。(数据库连接、打开的socket、打开的文件、以及其它没有必要保存在磁盘或者无法明显地采取对象序列化方式保存的资源。,EJ

12、B容器使用ejbPassive()方法使得Bean在合适的时候有机会释放这些资源或者处理这些资源。 一旦EJB容器的ejbPassive()方法结束,Bean必须处于可被钝化的状态。,钝化过程:,相反的过程发生在激活过程中。在此过程中,序列化的对话状态被读回内存,EJB容器使用对象序列化或者类似的方法重建内存状态。EJB容器接着调用Bean必需的ejbActivate()方法。ejbActivate()方法让Bean有机会恢复它在ejbPassivate()过程中所释放的资源。,钝化过程(采用just-in-time):,方法实现小结:,例子:,Num.java,NumHome.java,Nu

13、mEJB.java,NumClient.java,ejb-jar.xml,jboss.xml,8.3.3 会话Bean的生命周期图表,无状态会话Bean的生命周期图表,1 起初,EJB实例并不存在。比如有可能应用服务器是刚 刚启动的。,EJB容器将决定是否需要实例化新的EJB实例。 容器将何时实例化新的EJB实例呢? 取决于容器使用的EJB实例池策略。很有可能,容器会一次性实例化10个EJB实例,比如借助于Ejb-jar文件中的厂商专有部署描述符能够指定这种行为。 由于它们的 无状态性,使得创建的EJB实例并无差别。因此,不同的客户应用能够重用它们。,3 EJB容器 实例化 EJB类。 EJB

14、容器将调用Class.newInstance(“HelloBean.class”), 即动态创建HelloBean实例,这同new HelloBean()等价。因此,这使得容器不会将EJB Bean类的名字硬编码在Java代码中。最后,这使得容器更具通用性,能够操控任何企业Bean。当然,Bean类的默认构造器将被容器调用到,从而完成EJB实例的一些初始化工作。,4 容器调用setSessionContext()方法。这为EJB实例设置了上下文对象。最终,EJB实例将能够访问到EJB容器。,5 容器调用ejbCreate()。这将初始化EJB实例。注意,由于无状态会话Bean的ejbCreat

15、e()方法并不存在参数,因此EJB客户不可能为它提供任何启动EJB实例的参数信息。通常,EJB容器会准备好启动实例所需的参数,并预先创建若干无状态会话Bean实例。一般而言,当客户使用Home对象创建或销毁EJB实例时,内存中的EJB对象不一定会被创建或销毁。为实现异构客户间EJB实例池的维护,EJB容器控制了EJB实例的生命周期。因此,客户在使用Home对象创建或销毁EJB实例时,EJB容器未必会依次行事。,6 EJB容器调用 EJB实例的业务方法。对于EJB实例提供的所有业务方法,EJB容器都可以调用。由于所有EJB实例间不存在区别,因此完全不同的客户可以调用相同的业务方法。在业务方法调用

16、结束后,各个无状态会话Bean实例依然是相同的,它们甚至意识不到以前发生的业务方法调用。因此,EJB容器能够针对客户请求,在每个方法级将各个EJB实例指定给客户,即使同一客户对同一业务方法的多次调用,都可以由不同的EJB实例响应它。当然,将EJB实例指定给客户的具体实现策略取决于具体的EJB容器。,7最后, EJB容器调用 ejbRemove()方法。当EJB容器需要销毁会话Bean实例时,EJB实例的ejbRemove()方法将被调用。注意,ejbRemove()方法将告知EJB实例,它将销毁EJB实例本身,从而结束EJB实例的生命周期。所有的无状态EJB组件必须实现无参的ejbRemove()方法。因此,每个无状态会话Bean仅仅含有单个ejbRemove()方法。相比之下,允许存在多个ejbCreate()方法。仅仅提供单个的无参ejbRemove()方法是很好的设计决定。,有状态会话Bean的生命周期图表,不要依赖于ejbRemove() 容器可以在任何时候调用ejbRemove(),比如由于EJB容器已经超时了很长时间,在EJB容器已经意识到EJB实例已经过期时,ejbRemove()将被调用。但是,EJB容器也有可能从不调用EJB实例的ejbRemove()方法,比如,EJB容器瘫痪,或者出现了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论