`
xgbjmxn
  • 浏览: 270511 次
  • 性别: Icon_minigender_1
  • 来自: 新乡
社区版块
存档分类
最新评论

会话Bean 开发

    博客分类:
  • ejb
阅读更多
会话Bean能分为有状态会话Bean(stateful Bean)和无状态会话Bean(stateless Bean),有状态会话Bean能在客户访问之间保存数据,而无状态会话Bean不会在客户访问之间保存数据。两者都实现了 javax.ejb.SessionBean接口,EJB容器区通过部署文件ejb-jar.xml来判断是否为一个SessionBean提供保存状态的服务,另外,在程式实现上,无状态Bean不能声明实例变量,每个方法只能操作方法传来的参数,如果需要在引用期间维持一些数据状态,以在其他方法中能引用,则能把Bean设计成有状态会话Bean。在第二节中我们用一个SatatelessDate Bean例子描述了研发无状态会话Bean的过程及特性,下面的一节将介绍关于有状态会话Bean的一些特性和寿命周期,并用一个例子来证实这些特性。

  在本节中你将了解到:

  什么是有状态Session Bean?

  有状态Session Bean寿命周期

  编写一个有状态Session Bean程式

  部署到应用服务器

  研发和部署测试程式

  运行测试程式

  什么是有状态Session Bean?

  有状态会话Bean(Stateful Session Bean)就是在客户引用期间维护Bean中的所有实例数据的状态值,这些数据在引用期间能被其他方法所引用,其他客户不会共享同一个Session Bean的实例。Bean的状态被保存到临时存储体中,因为Bean是能被序列化的,所以同样也能把一个Bean状态保存到文件系统或数据库中。因为在调用方法时需要维护状态(这部分是有开销的),所以只有需要维护客户状态时才使用有状态会话Bean。典型的会话Bean是购物车,当一个客户第一次打开购物车时,系统为他分配一个购物车的会话Bean,在以后,每当客户选购了商品将改动购物车的商品记录,而这些记录数据将保存到用户会话数据中。

  有状态Session Bean寿命周期

  有状态Session Bean寿命周期由容器控制,Bean的客户并不实际拥有Bean的直接引用,当我们部署一个EJB时,容器会为这个Bean分配几个实例到组件池(component pooling)中,当客户请求一个Bean时,J2EE服务器将一个预先被实例化的Bean分配出去,在客户的一次会话里,能只引用一次Bean,就能执行这个Bean的多个方法。如果又有客户请求同样一个Bean,容器检查池中空闲的Bean(不在方法中或事务中,如果一个客户长时间引用一个Bean 但执行一个方法后需要等待一段时间再执行另一个方法,则这段时间也是空闲的),如果全部的实例都已用完则会自动生成一个新的实例放到池中,并分配给请求者。当负载减少时,池会自动管理Bean实例的数量,将多余的实例从池中释放。

  有状态会话Bean的寿命周期比无状态会话Bean更加的复杂,有状态会话Bean有四种状态:

  不存在

  方法现成

  事务中方法现成

  钝化

  如图3-1所示:

  


  


  <图3-1>

  有状态会话Bean的初始化状态为不存在,当有客户引用一个Bean时,按照顺序调用newInstance()、 setSessionContext()和ejbCreate()方法,和第一节中讲到的无状态调用顺序相同。当处于方法现成状态时,如果客户调用 remove()方法,则回到不存在状态,并触发Bean的ejbRemove()方法。如果客户长时间不调用Bean或服务器准备释放一些内存资源,则容器将这些Bean从组件池中钝化,钝化过程容器将调用Bean的ejbPassivate()方法,使程式员有机会在钝化Bean时释放分配的资源。当一个客户请求一个被钝化的Bean时,容器能激活Bean,激活过程容器将调用ejbActivate()放,使程式员有机会在Bean转到方法现成状态时分配Bean所需的资源。

  Bean本身能管理事务(BMT Bean-Managed Transactions),也能由容器管理事务(CMT Container-Managed Transation)。对于CMT,容器在方法开始时打开事务,在方法结束时实现事务。Bean研发人员能通过afterBegin()、 beforeCompletion()、afterCompletion(Boolean)来获取事务的各个状态,如果 afterCompletion(Boolean)中Boolean变量为true表示事务完成,为false表示事务被撤消。

  编写一个有状态Session Bean程式

  假设这次我们要为一个基金组织编写一个基金帐户的Bean组件,这个组件将为基金管理系统提供一个基金帐户的基本功能。为了能够描述清晰有状态会话 Bean的特性,我们将之简化成提供三个业务逻辑接口:addFunds()方法为一个基金帐户添加基金,removeFunds()方法从基金帐户中取出基金,方法getBalance()为我们提供一个基金帐户的余额查询。我们为这个Bean起名为StatefulAccount

  设计一个有状态的Session Bean至少包括四个步骤:

  研发主接口

  研发组件接口

  研发Bean实现类

  编写部署文件

  注意:本节假设你使用的视窗系统操作系统。如果使用其他操作系统,可能影响到存储路径和JDK命令,但这和程式代码和部署文件内容无关。

  1.研发主接口(StatefulAccountHome.java):

  是由Bean研发人员编写的一个Bean的主接口(interface)程式,负责控制Bean的生命周期(生成、删除、查找Bean)。只需要研发人员给出一个主接口类,类方法的实现由容器来完成。

  主接口扩展了javax.ejb.EJBHome接口,参考avax.ejb.EJBHome接口定义如下:

  package javax.ejb;

  import java.rmi.Remote;

  import java.rmi.RemoteException;

  public interface EJBHome extends Remote{

  public abstract EJBMetaData getEJBMetaData() throws RemoteException;

  public abstract HomeHandle getHomeHandle() throws RemoteException;

  public abstract void remove(Object obj) throws RemoteException,RemoveException;

  public abstract void remove(Handle handle) throws RemoteException,RemoveException;

  }

  方法getEJBMetaData()返回EJBMetaData接口的引用,取得Bean的信息,EJBMetaData不是远程接口。这个类扩展了java.io.Serializable,所以可序列化,具有序列化的特性

  方法getHomeHandle()返回主对象的句柄,句柄是主接口StatelessAccountHome的持久性引用,这个类扩展了 java.io.Serializable,所以可序列化,具有序列化的特性,HomeHandle 对象能传递给另一个JVM,且不传递安全信息,这样新的应用能不使用JNDI来查找对象既能获得这个主接口,并来创建和获得Bean实例。

  方法remove()用来删除一个Bean的实例,对于一个会话Bean,执行Remove操作将引用的Bean返回到池中,由池来管理其生命周期。

  一般情况下,习惯将主接口的命名规则规定为<bean-name>Home,所以我们把这个主接口类起名为StatefulAccountHome

  大部分逻辑方法已被EJBHome定义,在我们要设计的远程主接口中,不必再重新定义。值得注意的是,我们需要为这个接口定义一个create()方法,用来获得一个实例Bean的引用,返回的对象类型是组件接口类StatefulAccount。和第二节的StatelessDateHome类定义基本相同,不同的是Create()方法需要一个double类型的fund参数,当客户创建一个Bean引用时,我们将通过这个参数初始化基金帐户的余额。Fund数值的状态将由容器来维护。

  StatefulAccountHome.java代码:

  import java.rmi.RemoteException;

  import javax.ejb.CreateException;

  import javax.ejb.EJBHome;

  public interface StatefulAccountHome extends EJBHome{

  public StatefulAccount create(double fund) throws RemoteException,CreateException;

  }

  假设我们保存到D:\ejb\StatefulAccount\src\StatefulAccountHome .java

  2.研发组件接口(StatefulAccount.java):

  当远程用户调用主接口类生成方法(create(double))时,客户要得到一个组件的远程引用,因此EJB容器需求你为这个Bean的所有方法提供一个接口类,而类的实现则和远程主接口StatefulAccountHome 相同由容器在部署时自动生成。

  组件接口扩展了avax.ejb.EJBObject接口,参考avax.ejb.EJBObject接口定义如下:

  package javax.ejb;

  import java.rmi.Remote;

  import java.rmi.RemoteException;

  public interface EJBObject extends Remote{

  public abstract EJBHome getEJBHome() throws RemoteException;

  public abstract Handle getHandle() throws RemoteException;

  public abstract Object getPrimaryKey() throws RemoteException;

  public abstract boolean isIdentical(EJBObject ejbobject) throws RemoteException;

  public abstract void remove() throws RemoteException,RemoveException;

  }

  方法getEJBHome()返回远程主接口对象的引用

  方法getHandle() 当前组件接口对象的句柄,和远程主接口的句柄HomeHandle相同,这个对象是被序列化的,所以能保存到本地或通过RMI/IIOP协议传输给其他 JVM上的客户使用,而免去JNDI查找和调用主接口的create方法,只要执行Handle.getEJBObject()方法即可取得这个Bean 实例的引用。

  getPrimaryKey()方法一般用于Entity Bean,如果在Session Bean中调用,抛出java.rmi.RemoteException。

  方法isIdentical()用于对当前引用的Bean实例和另一Bean实例进行比较
#

分享到:
评论

相关推荐

    Bean开发实例之二有状态会话Bean开发实例

    ### Bean开发实例之二:有状态会话Bean开发实例 #### 概述 本文档将详细介绍如何使用Java Business Components (JBX) 和 WebLogic Server (WLS) 开发一个有状态会话Bean(Stateful Session Bean)的具体实例。在这...

    Jboss下开发ejb应用之一会话bean的应用

    本文将围绕“Jboss下开发ejb应用之一会话bean的应用”这一主题,深入探讨如何在Jboss应用服务器上开发和部署会话Bean,以及涉及到的相关工具和源码。 会话Bean是EJB的一种类型,它代表了业务逻辑组件,为客户端提供...

    实战EJB之三 开发会话Bean(有状态会话Bean).doc

    实战EJB之三开发会话Bean(有状态会话Bean) 本文主要讲解了有状态会话Bean(Stateful Session Bean)的概念、特点、生命周期和开发过程。下面是相关知识点的总结: 1. 什么是有状态会话Bean? 有状态会话Bean...

    Eclipse+Jboss EJB技术 会话Bean

    本实验以"广东工业大学Java EE Web编程技术课程"为背景,通过集成开发环境Eclipse和应用服务器JBoss,来实践会话Bean的创建和使用。 首先,Eclipse是一款广泛使用的Java IDE,它提供了丰富的工具和插件,支持Java ...

    EJB3 示例有状态和无状态会话bean

    - **会话Bean (Session Bean)**:分为有状态和无状态两种,用于封装业务逻辑操作。 - **消息驱动Bean (Message-Driven Bean)**:处理JMS(Java Message Service)消息。 ### 2. 有状态会话Bean (Stateful Session ...

    无状态会话Bean实验指导.doc

    【无状态会话Bean实验指导】的文档主要涵盖了如何开发和测试无状态Session Bean的步骤,这是企业级JavaBeans(EJB)技术的一部分,属于中间件领域的知识。EJB是Java平台上的一个标准,用于构建可扩展、可靠的分布式...

    EJB 会话BEAN PPT

    理解并熟练掌握EJB的使用,尤其是会话Bean的特性,对于开发高质量的Java企业应用至关重要。参考文献如《精通EJB3.0》、《EJB3 in action》和《EJB3.0入门经典》可以帮助深入学习EJB的相关知识。

    EJB3.0源代码,包含会话Bean,实体Bean,还有消息Bean

    本资源包包含了会话Bean、实体Bean和消息Bean的源代码,这三种类型的Bean是EJB 3.0的核心组成部分。 1. **会话Bean (Session Beans)** - **无状态会话Bean (Stateless Session Beans)**: 提供无持久性状态的业务...

    实验一 开发环境安装、配置及无状态会话Bean的创建

    实验一 开发环境安装、配置及无状态会话Bean的创建 在本实验中,我们将学习如何安装和配置 JBoss 服务器,配置 MyEclipse 环境,创建及测试 EJB3 无状态会话 Bean。本实验将帮助我们掌握 JBoss 的安装与配置,掌握...

    EJB3开发第一个无状态会话bean

    **EJB3 开发第一个无状态会话 Bean 知识详解** 无状态会话 Bean(Stateless Session Bean)是企业级 Java(EJB)3.0 中的核心组件,主要用于实现业务逻辑,它不保存任何特定客户端的状态信息。本篇文章将深入讲解...

    关于有状态和无状态会话bean的解释

    在Java企业版(Java EE)开发中,会话Bean是核心组件之一,它们负责处理业务逻辑。本篇文章将深入探讨有状态(Stateful)和无状态(Stateless)会话Bean的区别,以及如何在实际应用中选择合适的类型。 首先,我们要...

    ejbt1.会话bean

    开发EJB3会话Bean时,开发者通常会在Bean类上使用`@Stateless`或`@Stateful`注解来指定其类型。此外,还可以使用`@Remote`或`@Local`注解定义Bean的接口,供客户端调用。对于业务方法,可以通过`@...

    JavaEE5学习笔记05-EJB之会话Bean总结

    ### JavaEE5学习笔记05-EJB之会话Bean总结 #### EJB(Enterprise JavaBeans)简介 EJB(Enterprise JavaBeans)是Java EE平台的一部分,用于开发和部署可重用的服务组件。EJB规范定义了如何编写、部署以及管理企业...

    ejb.zip_单身会话bean

    EJB规范定义了多种类型的beans,其中包括我们关注的“单身会话bean”。在这个ejb.zip_单身会话bean的压缩包中,我们很可能会找到关于这些特定类型的EJB实例代码。 首先,我们要理解“有状态会话bean”(Stateful ...

    实验6-无状态会话bean.docx

    【实验6-无状态会话bean】是关于Java企业级应用开发的一个实践环节,主要涉及的是EJB(Enterprise JavaBeans)中的无状态会话bean。无状态会话bean是一种服务器端组件,它不保存任何会话状态信息,每次调用都是独立...

    实验6-无状态会话bean.pdf

    【实验6-无状态会话bean】主要涉及的是Java企业级应用开发中的核心概念——无状态会话Bean(Stateless Session Bean),这是Java EE(Java Platform, Enterprise Edition)规范中的重要组成部分,主要用于处理业务...

    使用JBoss 4.2书写EJB3.0无状态会话Bean + JPA + MySql 5.0的Hello World Java EE应用

    环境:Window XP profession, JDK 1.6, MySQL 5.0, JBoss...该示例使用EJB 3.0的无状态会话Bean呼叫JPA持久层完成数据库的操作,推荐广大企业级Java程序员项目中使用。 注意:连接池的配置参见上一个资源readme.txt文档

    PAS(Primeton Application Server)企业版EJB开发案例分析:有状态/无状态会话Bean与CMP/BMP实体Bean

    主要包括有状态会话Bean (Stateful Session Bean) 和无状态会话Bean (Stateless Session Bean),以及容器管理持久化实体Bean (CMP Entity Bean) 和Bean管理持久化实体Bean (BMP Entity Bean) 的开发过程。...

Global site tag (gtag.js) - Google Analytics