概说EJB的Session Beans

ZDNet软件频道 时间:2002-07-22 作者:BUILDER.COM |  我要评论()
本文关键词:
理解Session Beans的瞬时现象对开发者的工作会带来莫大的帮助。有状态和无状态Beans的细微差别就如同充分利用其行为一样重要。在掌握以上的概念之后,正确的设计和实现Session Beans必然会显著改进EJB应用程序的功能和效率。
EJB(Enterprise JavaBeans)可谓Java 2 Enterprise Edition应用程序的发动机,它位于后端系统和表示层之间,EJB分为三种类型:Session(会话)、Entity(实体)和Message Driven(消息驱动)。Session Beans是其中应用最为灵巧的一种。在EJB的框架以内,Session Bean封装了一定的任务或者面向过程的行为(你可以阅读我在以前文章中对EJB的介绍)。

会话

请把Session Beans看作任务而非持久数据,只有这样,你才能清晰地理解使用它的场合和原因。比如说,Session Bean可能会对数据库内的用户进行检索操作,但并不把用户表示为持久的业务对象。Session Beans可以同其他类型的Java beans通信,这种能力已经超出了数据库事务概念之外。在这种方式下工作的分布式应用程序特别适合于采用Session Beans。

所有的Session Beans都派生于javax.ejb.SessionBean类。就像其名称那样, Session Beans只存在于单一客户会话中。这里的客户可能是Java Servlet、桌面应用程序、别的EJB乃至采用Java Bean的其他事务信息方式。Session Bean的生存期从客户程序发起接触开始,在客户通过调用EJB宿主接口的remove()方法显式破坏bean时终止。会话还会在预先设置的时间终止,而这种时间设置则由EJB容器内确定。考虑到服务器的资源,开发者往往会设法避免处理“超时”设置而在编写客户程序时做相应的延期处理。此外,开发者还应该在EJB容器重新启动的时候小心Session Bean的短暂寿命;客户程序可以重新获得同类bean的引用,但很有可能却不是同一bean。

无状态bean

Session Beans可以是无状态也可以是有状态的,因而两者会显示出不同的行为。Session Bean的状态概念类似于HTTP设置:客户程序和服务器之间的交互(在这种情况下就是bean自身)发生在定义的环境之内。有状态的Session Bean会在多个方法调用的情况下保存客户和bean的有关信息。有状态的Session Bean只能同一个客户程序通讯,而无状态Session bean的实例却可以同时和若干个客户程序通讯。程序清单 A所示就是无状态Session Bean的示例。在编程时客户程序采用这种bean的情况请参考程序清单 B

接口:ejb-jar.xml

确定bean是无状态还是有状态是通过bean的部署描述符告诉bean容器的。这里的部署描述符就是ejb-jar.xml。无状态Session Bean的部署描述符类似程序清单 C。只需要修改一行代码就可以将其变为有状态Bean:
<session-type>Stateful</session-type>

这种差别促使容器能够更高效地管理相关资源。无状态Bean的会话终止之后,容器把bean返回给资源池。由于客户程序需要这些beans,所以容器就通过这种资源池提供bean的实例。假如请求超过了可用的beans数目,容器就会创建出更多的实例;假如客户程序不需要beans则容器可以破坏资源池中的实例。在这种按需创建的基础之上,有状态Beans即开始了以上所述的一对一关系。

假如客户不再使用有状态Bean,容器就会保存bean的状态,通常就是把有关信息写到磁盘上去。

有状态bean

当然,开发人员需要编写额外的代码才能利用有状态Bean。程序清单 D所示的代码在上面的示例中就添加了状态持久的数据成员和方法。客户程序采用这种bean的方式也略有不同。由会话bean访问的数据库通过setMessages()方法负责装载状态Bean特定的HashMap。这样就令HashMap实现了状态持久化,而且只保存标识客户有关的消息。实际上的客户程序可能类似于程序清单 E

状态Bean有一点必须特别注意:它的create()方法需要一个参数。该参数的作用是标识正确的bean及其关联的状态。此外,状态Session Bean更多地依赖于ejbActivate()ejbPassivate()方法,从而允许激活(或禁用)bean的实例。开发人员可以采用这些方法进行常规维护,比如关闭数据库连接等。即便有状态Session Beans带来了一定程度的持久性,但是容器仍然会在一定的时间或者在容器被重新启动之后破坏没有用到的引用。这一行为正好同Entity Beans相反,在后续的文章里会谈到,Entity Beans的信息会在超时之后或者重新启动时保留。


下载代码
下载MessageManagerBean.java、ejb-jar.xml和MessageManagerStateBean.java的地址

小结

通过表示J2EE应用程序中的任务或者行动。Session Beans可以因此而处理大量的状态。尤其是在同其他EJB合用的情况下。理解Session Beans的瞬时现象对开发者的工作会带来莫大的帮助。有状态和无状态Beans的细微差别就如同充分利用其行为一样重要。在掌握以上的概念之后,正确的设计和实现Session Beans必然会显著改进EJB应用程序的功能和效率。


责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134