Enterprise JavaBeans组件慨述(5)

来源:互联网 发布:centos netcat 编辑:程序博客网 时间:2024/06/05 07:52
服务器和容器

   EJB 体系结构包括 EJB 服务器和 EJB 容器两个概念。EJB 服务器充当一种组件执行系统,正如 EJB 白皮书中所述:

   “Enterprise JavaBeans 规范为每个支持完全可移植性的 Java 应用程序服务器定义了一个标准模型。任何厂商都可以使用此模型来实现对 Enterprise JavaBeans 组件的支持。多种系统(如 TP 监视器、CORBA 运行时系统、COM 运行时系统、数据库系统、Web 服务器系统或其它基于服务器的运行时系统)都可以调整到能够支持可移植的 Enterprise JavaBeans 组件。”(Thomas, Enterprise JavaBeans Technology: Server Component Model for the Java Platform)

   EJB 服务器为使用 EJB 组件的应用程序提供操作环境,并供应所有必需的服务,来支持 EJB 体系结构。打包 EJB 服务器软件并没有预先规定的方式。一种方法是将它作为一项功能增强包括到应用程序服务器中,这就是在 IBM WebSphere Application Server, Advanced Edition, Version 2.0 中采用的方法。

   EJB 组件并不在 EJB 服务器的顶部直接执行。一个称为 EJB 容器的中间软件组件在 EJB 服务器环境中运行,从而又为这些 bean 自身提供操作环境。EJB 容器对 EJB 应用程序是完全透明的,但是在支持 bean 操作方面起着关键性的作用。

   为了使 enterprise bean 能充当可重用的软件组件,它们对特定的服务器或平台功能不能有内建的相关性。服务器端功能的几种常见类型已经被从 bean 设计中“分离出去”,而将此功能的责任转移给了容器组件。例如,容器将被用来接管安全性、并发性、事务处理、交换到辅助存储器和其它服务的责任,从而使 bean 免受服务器相关性的制约,并将按业务逻辑来优化,而不是按服务逻辑来优化。

   EJB 白皮书这样描述容器的作用:

   “EJB 容器管理部署于其中的 enterprise bean。客户机应用程序并不直接与 enterprise bean 进行交互。相反,客户机应用程序通过由容器生成的两个封装接口( EJB Home 接口和 EJB Object 接口)与 enterprise bean 进行交互。当客户机使用封装接口调用各种操作时,容器截获每个方法调用,并插入管理服务。”(Thomas, Enterprise JavaBeans Technology: Server Component Model for the Java Platform)

   可以期望 EJB 容器软件一般都会随 EJB 服务器软件一起提供,尽管规范允许分离这些组件。除了提供对运行时服务(如事务处理和安全性)的访问以外,还期望 EJB 容器包括各种必要工具,来支持 enterprise bean 的安装、操作和管理。例如,需要有工具解释 EJB jar 文件的内容,有工具生成数据库访问,来获得容器提供的持久性,有工具监视正在运行的 bean 的行为,以及实现安全性等。

 Bean 风格

   EJB 组件分为两种主要类别 -- 会话 bean 和实体 bean。根据 bean 处理状态、事务和持久性的方式这些类别还可以进一步细分。会话 bean 通常具有以下属性:

   代表单个客户机执行

   可以是事务性的

   可以更新共享数据库中的数据

   生存期相对较短

   其生存期通常就是客户机的生存期

   任何持久性数据都由 bean 管理

   可以依容器的判断予以删除

   在 EJB 服务器失败时被删除

   实体 bean 通常具有以下属性:

    代表数据库中的数据

    是事务性的

    允许多个用户共同访问

    可以长期存在

    持久性数据可以由容器管理

    在 EJB 服务器失败后能继续生存

   EJB 规范对会话 bean 和实体 bean 的说明如下:

   “对于客户机,会话 enterprise bean 是一种非持久性的对象,它实现某些在服务器上运行的业务逻辑。想像一个会话对象的一种方式是:会话对象是运行在服务器上的客户机程序的逻辑扩展。会话对象不在多台客户机之间共享。

   “对于客户机,实体 enterprise bean 是一种持久性对象,它代表一个存储在持久性存储器(例如,一个数据库)中的实体的对象视图,或者是一个由现有企业应用程序实现的实体。”(Enterprise JavaBeans Specification 1.0)

   用一种粗略的说法,会话 bean 代表这样的操作,它检索或存储数据以满足用户请求;而实体 bean 则代表一种数据集,可以访问这些数据集来满足用户请求。

会话 bean

   最简单的一种 Enterprise JavaBeans 组件就是无状态的会话 bean。因为这些 bean 没有可以区分它们的状态,所有的实例都是完全相同的。容器管理无状态会话 bean 的生存周期,其方式是通过创建足够数目的此种 bean 来适应客户机工作负荷,并在不需要它们时将其删除。钝化,即将闲置的 bean 写到磁盘上,不用于无状态的会话。要调用 bean,客户机程序调用本地接口中的 standard create() 方法,尽管此操作不一定导致实例化新的 bean 实例。容器可以选择将客户机请求发送给现有的对象。反之,容器则可以按它的选择创建新的实例,且独立于由客户机发布的 create() 方法。

   在 EJB 本地对象上发布的 create() 调用返回一个对 EJB 对象的引用,这个 EJB 对象代表 enterprise bean。一旦客户机有了 EJB 对象引用,它就可以将业务方法发布到 EJB 对象上,容器随之会将这些方法委托给 bean 自身。负责管理会话 bean 的容器组件无需推断会话 bean 是否是无状态的。会话 bean 是无状态的还是有状态的在安装时声明。

   如果会话 bean 在方法调用之间保留状态信息,则它是有状态的。通过调用 ejbPassivate() 方法,容器可以依其判断将有状态会话 bean 钝化,或写到辅助存储器中。EJB 规范并不要求容器在钝化 bean 时使用 Java 串行化协议,但是它们必须提供等价的功能。当容器决定将一个非活动的会话 bean 交换回到内存中时,它会取消被动 bean 的串行化,并调用 ejbActivate() 方法。有状态会话 bean 的开发人员负责确保状态数据是可串行化的。在集群的应用程序服务器环境中实现有状态会话 bean 时务必要小心,因为并不是所有的服务器都支持集群的有状态会话 bean 的同步化。

有状态会话 bean 可以是事务性的。通过使用 javax.transaction.UserTransaction 接口中的方法,如 begin()、commit() 和 rollback(),bean 可以控制事务;通过实现 javax.ejb.SessionSynchronization 接口,bean 可以接收有关事务状态的通知。EJB 容器无需推断哪些 bean 需要事务支持;UserTransaction 接口仅可用于那些在安装时被标记为事务性的 bean。

实体 bean

   实体 bean 在体系结构上与会话 bean 类似,但它们提供对企业数据的访问,而不是支持用户会话。一个实体 bean 可以支持多个并发用户,而容器则使访问和事务同步化。实体 bean 还具有支持本地对象中的 finder 方法的主键。知道实体 bean 的主键的客户机可以通过调用本地对象上的 findBy PrimaryKey() 方法获得对象引用。与会话 bean 不同,实体 bean 的本地对象除了具有 create 方法外还具有 finder 方法。

   持久性是实体 bean 的一个基本属性。EJB 规范允许两种形式的实体持久性:bean 管理的持久性和容器管理的持久性。对于代表关系数据库中的数据的实体 bean,bean 对持久性的管理意味着,对数据库访问的调用是直接编写在企业 bean 的方法中的(使用 JDBC 或 SQLJ)。这种方法是直截了当的,但它降低了可移植性。容器对持久性的管理意味着 bean 不受数据库调用的影响。在安装时告知容器有关 bean 数据所需的持久性,而容器负责生成实现持久性的代码。这种方法允许 bean 的可移植性更高,甚至达到持久性可使用不同数据源的程度。然而,此方法要求容器中要有复杂功能。

   当实体 bean 对象与 EJB 对象相关联时,前者处于就绪状态;否则将认为它们处于共享状态。当客户机调用 EJB 对象中的方法时,容器查找关联的实体 bean 的实例(如果存在的话),或者从共享状态中传送出一个实例。处于就绪状态的实体 bean 可以接收到通过委托从客户机传播给它们的业务方法调用。它们还可以在容器请求时执行 ejbLoad() 和 ejbStore() 方法。load 方法和 store 方法旨在维持实体 bean 和基础数据存储之间数据的一致性。

   实体 bean 支持多个用户并发地访问数据。EJB 规范声明,维持数据完整性是容器的责任:

   “enterprise bean 开发人员在编写业务方法时无需担心来自多个事务的并发访问。enterprise bean 开发人员在编写方法时可以假定,对于被多个事务同时访问的各个实体 bean,将能确保适当的同步化。”(Enterprise JavaBeans Specification 1.0)

容器完成这一任务通常是通过锁定数据库中的数据,并使访问串行化,或通过创建实体 bean 的多个实例,并允许在基础数据存储中使用并发控制,这样来管理访问。

   第三部分内容预告

   “什么是 Enterprise JavaBeans 组件?”的第三部分将讨论安装 EJB 组件的特殊部署过程。它还将说明 CORBA 是否是 EJB 组件的竞争对手(答案是“否” -- 请参阅 EJB 技术是如何补充 CORBA 的)。最后,您将看到一种基于 EJB 的三层编程模型的使用情况。 
原创粉丝点击