WebLogic Enterprise JavaBean 编程

了解 Enterprise JavaBean

以下部分简要回顾了不同的 Enterprise JavaBean (EJB) 类型以及它们在应用程序中可提供的功能,并描述了它们如何使用其他应用程序对象和 WebLogic Server。

假定读者熟悉 Java 编程和 EJB 2.x 概念及功能。

 


应用程序如何使用 EJB?

以下部分描述每个 Bean 类型的用途和功能。

会话 EJB 实现业务逻辑

会话 Bean 实现业务逻辑。一个会话 Bean 实例一次可为一个客户端提供服务。有两种类型的会话 Bean:有状态和无状态。

无状态会话 Bean

无状态会话 Bean 不存储调用间的会话或客户端状态信息,它唯一可以包含的状态不特定于客户端,例如,缓存的数据库连接或对其他 EJB 的引用。无状态会话 Bean 最多可以存储方法调用期间的状态。方法完成后,便不再保留状态信息。无状态会话 Bean 的任何实例均可为任何客户端服务 - 任何实例都是等效的。无状态会话 Bean 可比有状态会话 Bean 提供更好的性能,因为每个无状态会话 Bean 实例可支持多个客户端(虽然一次只能支持一个)。

示例:如果一个 Internet 应用程序允许访问者单击“联系我们”链接并发送电子邮件,则此应用程序可基于 JSP 从用户收集的来往信息,使用无状态会话 Bean 生成电子邮件。

有状态会话 Bean

有状态会话 Bean 维护反映 Bean 和特定客户端之间在方法和事务中交互的状态信息。有状态会话 Bean 可管理客户端和其他企业 Bean 之间的交互,或管理工作流。

示例:如果一个公司网站允许员工查看和更新个人配置文件信息,则此网站可在用户单击页面上的“查看我的数据”后,使用有状态会话 Bean 调用多种其他 Bean 以提供用户所需的服务:

  • 接受来自 JSP 的登录数据,并调用工作任务为验证此登录数据的其他 EJB。
  • 向 JSP 发送授权确认。
  • 调用用于访问授权用户的配置文件信息的 Bean。

实体 EJB 可维护持久性数据

实体 Bean 代表了一组持久性数据,通常为数据库中的行,并提供了用于维护或读取此数据的方法。实体 Bean 通过主键唯一标识,并可提供对多个客户端的同时服务。实体 Bean 可参与到与其他实体 Bean 的关系中。实体 Bean 之间的关系是实体 Bean 所模仿的实际实体的一个功能。实体 Bean 的字段及其与其他实体 Bean 的关系是在一个对象 Schema 中定义的,后者是在 Bean 的 ejb-jar.xml 部署描述符中指定的。

实体 Bean 还可以将其他 Bean 类型(如消息驱动或会话 Bean)作为客户端,也可以由 Web 组件直接访问。客户端使用实体 Bean 可访问持久性存储中的数据。实体 Bean 封装了数据库访问的机制,使其客户端不受数据库访问的复杂性的影响,并取消了物理数据库详细信息与业务逻辑之间的联系。

示例:上例中的有状态会话 Bean 为在公司局域网中访问个人配置文件信息的员工协调服务,此 Bean 可使用实体 Bean 来获取和更新员工的配置文件。

消息驱动 Bean 实现松耦合的业务逻辑

消息驱动 Bean 实现松耦合的或异步的业务逻辑,其中不需要立即响应请求。消息驱动 Bean 从 JMS 队列或主题接收消息,并根据消息内容执行业务逻辑。它是 EJB 和 JMS 之间的异步接口。

MDB 实例在其整个生命周期中可处理来自多个客户端的消息(虽然不是同步处理)。它不保留特定客户端的状态。某个消息驱动 Bean 的所有实例都是等效的 - EJB 容器可为任何 MDB 实例指定消息。容器可以集中这些实例,以便能够并发处理消息流。

EJB 容器与消息驱动 Bean 直接交互 - 根据需要创建 Bean 实例并为这些实例传递 JMS 消息。容器在部署期间创建 Bean 实例,并在运行期间根据消息流量添加和删除实例。

示例:如果一个在线购物应用程序接受来自客户的订单的处理导致向供货商发出采购定单,则可通过消息驱动 Bean 实现供货商定购流程。虽然接受来自客户的订单总是导致发出供货商定单,但这两个步骤是松耦合的,因为没有必要在确认客户订单之前生成供货商定单。在发出关联的供货商定单前,将客户订单“堆积”的处理是可接受的(或者说,是有好处的)。

 


EJB 分析及环境

以下部分简要描述每个 Bean 类型所需的类、EJB 运行时环境以及控制 Bean 的运行时行为的部署描述符文件。

EJB 组件

Bean 的组成因 Bean 类型不同而不同。表 2-1 定义组成每个类型的 EJB 的类,并定义每个类类型的用途。

表 2-1 EJB 的组件
EJB 组件
描述
无状态会话
有状态会话
实体
MDB
远程接口
远程接口向远程客户端(与 EJB 不在同一应用程序中运行的客户端)公开业务逻辑。它可定义远程客户端可以调用的业务方法。
本地接口
本地接口向本地客户端(与 EJB 在同一应用程序中运行的客户端)公开业务逻辑。它可定义本地客户端可以调用的业务方法。

注意: 1.1 EJB 不提供。

本地 Home 接口
本地 Home 接口(也称为 EJB 工厂或生命周期接口)提供多种方法,本地客户端(与 EJB 在同一应用程序中运行的客户端)可使用这些方法创建、删除 Bean 的实例,针对实体 Bean 还可以查找 Bean 的实例。
本地 Home 接口还具有“Home 方法”- 即非特定于特定 Bean 实例的业务逻辑。
远程 Home 接口
远程 Home 接口(也称为 EJB 工厂或生命周期接口)提供多种方法,远程客户端(与 EJB 不在同一应用程序中运行的客户端)可使用这些方法创建、删除和查找 Bean 的实例。
Bean 类
Bean 类实现业务逻辑。
主键类
只有实体 Bean 有主键类。主键类映射到数据库中的一个或多个字段,用于标识实体 Bean 对应的持久性数据。

EJB 容器

EJB 容器是部署到应用服务器的 Bean 的运行时容器。容器是在应用服务器启动时自动创建的,它充当 Bean 和诸如下列运行时服务之间的接口:

  • 生命周期管理
  • 代码生成
  • 持久性管理
  • 安全
  • 事务管理
  • 锁定和并发控制

EJB 部署描述符

Bean 的结构及其运行时行为是在一个或多个 XML 部署描述符文件中定义的。编程人员在 EJB 打包处理过程中创建部署描述符,在编译 Bean 时该描述符成为 EJB 部署的一部分。

WebLogic Server EJB 有三个部署描述符:

  • ejb-jar.xml - 标准的 J2EE 部署描述符。所有 Bean 都必须在 ejb-jar.xml 中指定。ejb-jar.xml 可指定将一起部署的多个 Bean。
  • weblogic-ejb-jar.xml - WebLogic Server 特定的部署描述符,它包含与 WebLogic Server 功能(如群集、缓存和事务)相关的元素。此文件在 Bean 利用 WebLogic Server 特定功能时是必需的。与 ejb-jar.xml 类似,weblogic-ejb-jar.xml 可指定将一起部署的多个 Bean。有关详细信息,请参阅 weblogic-ejb-jar.xml 部署描述符参考
  • weblogic-cmp-jar.xml - WebLogic Server 特定的部署描述符,它包含与实体 Bean 的容器管理的持久性相关的元素。必须在 weblogic-cmp-jar.xml 文件中指定使用容器管理的持久性的实体 Bean。有关详细信息,请参阅weblogic-cmp-jar.xml 部署描述符参考
关键部署元素映射

如在 EJB 部署描述符中所述,WebLogic Server EJB 的运行时行为可通过以下三种不同描述符文件中的元素进行控制:ejb-jar.xmlweblogic-ejb-jar.xml 和 weblogic-cmp-jar.xml

表 2-2 列出了其值在每个描述符文件中都必须匹配的元素。表中所列元素是在 Bean 和资源引用安全角色中定义的。

表 2-2 描述符文件中的元素映射
映射此元素
在 ejb-jar.xml 的此元素中
到 weblogic-ejb-jar.xml 的此元素中的相同元素
和 weblogic-cmp-
jar.xml 中的此元素
role-name
security-
role
security-role-
assignment
N/A
ejb-name
message-
driven, entity
 或  session
weblogic-enterprise-bean
weblogic-rdbms-
bean
ejb-ref
name
assembly-
descriptor
如果引用的 Bean 在当前 Bean 之外的其他容器中运行,则为  ejb-reference-description
如果引用的 Bean 与当前 Bean 在同一容器中运行,则为  ejb-local-reference-
description
N/A
res-ref-
name
resource-ref
resource-description
N/A

Bean 和资源引用

每个描述符文件都包含标识 Bean 的元素以及它使用的运行时工厂资源:

  • ejb-name - 用于在每个部署描述符文件中标识 Bean 的名称,与应用程序代码用于引用 Bean 的名称无关。
  • ejb-ref-name - 在发出引用的 Bean 的代码中用来对另一个 JAR 中的 Bean 进行引用的名称。
  • res-ref-name - 在发出引用的 Bean 的代码中用来对资源工厂进行引用的名称。

给定的 Bean 或资源工厂由包含它的每个描述符文件中的相同值标识。表 2-2 列出了 Bean 和 资源引用元素,及其在每个描述符文件中的位置。

例如,对于名称为 LineItem 的容器管理的持久性实体 Bean,下行:

<ejb-name>LineItem</ejb-name>

将出现在:

  • ejb-jar.xml 的 assembly-descriptor 元素中
  • weblogic-ejb-jar.xml 的 enterprise-bean 元素中
  • weblogic-cmp-jar.xml 的 weblogic-rdbms-bean 元素中
安全角色

安全角色是在 ejb-jar.xml 和 weblogic-ejb-jar.xml 的 role-name 元素中定义的。

有关:

 


EJB、客户端和应用程序对象

图 2-1 演示了 EJB 通常如何与 WebLogic Server 应用程序的其他组件关联,以及如何与客户端关联。

图 2-1 EJB 和其他应用程序组件

EJB 和其他应用程序组件

EJB 可由服务器端或客户端对象访问,如 Servlet、Java 客户端应用程序、其他 EJB、Applet 和非 Java 客户端。

EJB 的任何客户端,无论是在同一应用程序还是不同的应用程序中,都以类似的方式访问它。WebLogic Server 会自动创建 EJB 的 Home 和业务接口的实现,它可远程工作,除非 Bean 只有一个本地接口。

所有 EJB 必须使用 Java 命名和目录接口 (JNDI) 指定其环境属性。可以将 EJB 客户端的 JNDI 名称空间配置为包含驻留在网络上任何位置(多台计算机、应用服务器或容器上)的 EJB 的 Home 接口。

大多数 Bean 都不需要全局 JNDI 名称(在 weblogic-ejb-jar.xml 的 jndi-name 和 local-jndi-name 元素中指定)。大多数 Bean 都通过使用 EJB 链接中描述的 ejb-link 互相引用。

由于网络开销的原因,从同一计算机上的客户端访问 Bean 比从远程客户端更为有效,如果客户端位于同一应用程序中,则访问会更有效。

有关 EJB 的客户端访问编程的信息,请参阅 EJB 的客户端访问编程

EJB 通信

WebLogic Server EJB 使用:

  • T3 - 与本地对象通信。T3 是 WebLogic 专用远程网络协议,它实现了远程方法调用(Remote Method Invocation,简称 RMI)协议。
  • RMI - 与远程对象通信。RMI 使应用程序能够获取对位于网络中其他位置的对象的引用,并在此对象上调用方法,就像此对象与客户端本地共存于客户端虚拟机的同一 JVM 上一样。

    带远程接口的 EJB 即为 RMI 对象。EJB 的远程接口扩展了 java.rmi.remote。有关 WebLogic RMI 的详细信息,请参阅 WebLogic RMI 编程

  • HTTP - EJB 可使用 java.net.URL 资源连接工厂获取到 WebLogic Server 环境之外的 Web 服务器的 HTTP 连接。有关详细信息,请参阅配置 EJB 以向 URL 发送请求

可通过将 EJB 绑定到 WebLogic Server 自定义网络通道,指定EJB 使用的网络连接的特性。有关详细信息,请参阅配置 EJB 的网络通信

 


EJB 和消息目标引用

在此版本的 WebLogic Server 中,可使用逻辑消息目标将 ejb-jar.xml 中定义的逻辑消息目标映射到 weblogic-ejb-jar.xml 中定义的实际消息目标,如将 EJB 配置为使用逻辑消息目标中所述。

如果在部署期间无法解析消息目标引用,则将发出警告,但部署会成功。链接到不可用的消息目标的 MDB 会定期尝试连接到此消息目标。在消息目标可用之前,查找 ejb-jar.xml 中声明的message-destination-references 的尝试将失败并引发 javax.naming.NamingException。消息目标变得可用时,MDB 将与其连接并从其提供消息。

 


WebLogic Server 的增值 EJB 功能

此部分描述关键的 WebLogic Server 功能,它们可简化 EJB 的部署过程,并增强 EJB 应用程序的性能、可靠性以及可用性

WebLogic Server EJB 的性能增强功能

WebLogic Server 支持缓冲、缓存及可减少 EJB 响应时间和改善性能的其他功能。在生产环境中,这些功能可减少客户端用于获取 EJB 实例和访问及维护持久性数据的时间。

缓冲可减少 EJB 响应时间

WebLogic Server 维护着一个空闲缓冲池,其中有可供无状态会话 Bean、消息驱动 Bean 和实体 Bean 立即使用的 EJB 实例。EJB 容器会在启动时创建可配置数量的 Bean 实例,这样就不需要为每个请求创建一个新实例。客户端使用完 EJB 实例后,容器会将其返回到缓冲池中以供重用。有关详细信息,请参阅:

在此版本的 WebLogic Server 中,管理员可以通过管理控制台按需初始化 EJB 缓冲池。初始化 EJB 的缓冲池时,会将其重置为 EJB 刚刚部署后的状态。有关详细信息,请参阅“管理控制台联机帮助”中的初始化 EJB 的空闲 Bean 缓存和缓冲池

缓存可提高 EJB 性能

WebLogic Server 支持对有状态会话 Bean 和实体 Bean 的缓存。

可将不活动的已缓存 Bean 实例钝化(从缓存删除并写入磁盘),并在以后需要时恢复到内存中。钝化 Bean 实例可优化系统资源使用。

可以配置缓存的大小以及诸如从缓存中删除 Bean 的规则等相关行为。无论实体 EJB 使用容器管理的或 Bean 管理的持久性,它都支持使用缓存。

此外,在此版本的 WebLogic Server 中,管理员可以通过管理控制台按需初始化 EJB 缓存。初始化 EJB 的缓存时,会将其重置为 EJB 刚刚部署后的状态。有关详细信息,请参阅“管理控制台联机帮助”中的初始化 EJB 的空闲 Bean 缓存和缓冲池

有关详细信息,请参阅:

使用容器管理的持久性的 EJB 还可使用其他的一些缓存功能,将在以下部分中描述。

CMP 实体的其他缓存功能

WebLogic Server 为使用容器管理的持久性的实体 Bean 提供了以下缓存功能:

  • 关系缓存 - 通过将相关的 Bean 加载至缓存中,并通过为相关的 Bean 发出联合查询而避免多次查询,关系缓存可提高实体 Bean 的性能。有关详细信息,请参阅关系缓存
  • 应用程序级缓存 - 应用程序级缓存,又称为“组合缓存”,它允许属于同一 J2EE 应用程序的多个实体 Bean 共享一个运行时缓存。有关详细信息,请参阅配置应用程序级缓存
  • 事务间缓存 - 使用事务间缓存或长期缓存以使 EJB 容器能够在事务间缓存实体 Bean 的持久性数据。有关详细信息,请参阅使用 cache-between-transactions(长期缓存)限制数据库读取
用于有效查询的字段组(CMP 实体)

组指定实体 Bean 的一组持久性特性。字段组代表 Bean 的容器管理的持久性£¨container-managed persistence,简称 CMP£©字段和容器管理的关系(container-managed relation,简称CMR)字段的子集。可以将 Bean 中相关的字段放入组中,组将作为一个单元一起置入内存中。可将组与查询或关系关联,这样在由于执行查询或遵循关系而加载 Bean 时,将只加载组中提到的字段。有关详细信息,请参阅指定字段组

可配置的写入行为

可以配置 ejbLoad() 和 ejbStore() 方法的行为以增强性能,方法是避免对 ejbStore() 的不必要调用。在需要时,可以确保 WebLogic Server 在每个方法调用后调用 ejbStore(),而不是在事务结束时调用此方法。有关详细信息,请参阅了解 ejbLoad() 和 ejbStore() 的行为

操作顺序和批处理(CMP 实体)

WebLogic Server 允许对多个数据库操作进行批处理和排序,以便在一次数据库往返中完成这些操作。这样有助于避免一个事务影响多个实体实例时出现的瓶颈。有关详细信息,请参阅对操作进行排序和批处理

优化的数据库更新(CMP 实体)

在此版本的 WebLogic Server 中,对于 CMP 2.0 实体 Bean,setXXX() 方法不会将未更改的原始字段和不可变字段的值写入数据库中。这样的优化可提高性能,在数据库更新量很大的应用程序中尤其如此。

只读模式和只读失效(CMP 实体)

对于只是偶尔更新的 EJB 数据,可以通过实现只读和读写 EJB 的组合创建“主要读取模式”。如果使用主要读取模式,则可以使用多播失效来维护数据的一致性,这是使更新后的只读缓存数据失效的一种有效机制。在事务更新完成后使用invalidate() 方法可使本地缓存失效,并导致将多播消息发送到群集中的其他服务器以使其缓存副本失效。有关详细信息,请参阅使用主要读取模式

CMP Bean 可提高开发人员生产力

WebLogic Server 为使用容器管理的持久性的实体 Bean 提供了丰富的增值数据库访问功能:

自动主键生成(CMP 实体)

WebLogic Server 支持使用多种方法为 CMP 实体 EJB 自动生成简单的主键,包括使用 Oracle SEQUENCE(可由 WebLogic Server 自动生成)。有关详细信息,请参阅自动生成主键

自动创建表(CMP 实体)

可以将 EJB 容器配置为在实体 Bean 更改时自动更改底层表 Schema,以确保表始终反映最新的对象关系映射。有关详细信息,请参阅自动表创建(仅用于开发)

动态查询(CMP 实体)

WebLogic Server 允许在应用程序代码中以编程方式构造和执行 EJB-QL 查询。此功能便于您在不一定更新和部署 EJB 的情况下创建和执行新查询。它还减小了 EJB 部署描述符文件的大小及复杂度。有关详细信息,请参阅选择并发策略

可靠性和可用性功能

可以将 WebLogic Server EJB 部署到群集中,这样可为 EJB 的远程客户端提供负载平衡和故障转移的功能。必须将 EJB 部署到所有群集服务器上。

WebLogic Server 群集由多个 WebLogic Server 服务器实例组成,这些服务器实例同时运行并一起工作以提高可伸缩性和可靠性。对客户端而言,群集是一个 WebLogic Server 实例。构成群集的服务器实例可以在同一台计算机上运行,也可以位于不同的计算机上。

EJB 的故障转移和负载平衡功能由可识别副本的存根控件处理,后者可在群集中定位对象的实例。对象编译过程的结果是为 EJB 创建可识别副本的存根控件。EJB 可以有两种不同的可识别副本的存根控件:一个用于 EJBHome 接口,另一个用于 EJBObject 接口。这使一些 Bean 类型能够在客户端使用 EJBHome 存根控件查找 EJB 对象时利用 Home 级的负载平衡和故障转移功能,以及在客户端使用 EJBObject 存根控件对 EJB 进行方法调用时利用方法级的负载平衡和故障转移功能。表 2-3概括了对每个 EJB 类型的负载平衡和故障转移支持(方法级和 Home 级)。

群集 EJB 中的负载平衡可提高可伸缩性

Bean 存根控件包含了用于对对象的方法调用进行负载平衡的负载平衡算法(或调用路由类)。在每个调用中,存根控件可使用其负载算法选择要调用的副本。

WebLogic Server 群集支持群集 EJB 的负载平衡的多个算法;默认值为循环法算法。有关详细信息,请参阅“使用 WebLogic Server 群集”中的群集中的负载平衡

所有 Bean 类型都支持Home 级的负载平衡。除读写实体 Bean 之外,其他所有 Bean 类型都支持方法级的负载平衡。

注意: WebLogic Server 并不总对对象的方法调用进行负载平衡。在大多数情况下,使用与存根控件本身共存的副本效率更高,而不要使用位于远程服务器上的副本。
群集 EJB 的故障转移可提高可靠性

EJB 的故障转移可通过使用 EJBHome 存根控件完成,也可在受支持的情况下使用 EJBObject 存根控件完成。客户端通过存根控件对失败的服务进行调用时,该存根控件可检测故障并可对其他副本重试调用。

EJB 故障转移要求 Bean 方法必须具有幂等性,并按照 weblogic-ejb-jar.xml 中进行配置。有关详细信息,请参阅“使用 WebLogic Server 群集”中的 EJB 和 RMI 的复制和故障转移

表 2-3 概括了群集 EJB 的故障转移和负载平衡功能。

表 2-3  群集 EJB 的故障转移和负载平衡
EJB 类型
Home 级故障转移
方法级故障转移
备注
无状态会话
支持
支持
EJBObject 存根控件维护 EJB 的主要状态和次要状态的位置。次级服务器实例是使用 “使用 WebLogic 群集”中的 使用复制组中定义的规则选定的。
无状态会话 EJB 群集行为是在  weblogic-ejb-jar.xml 中配置的。请参阅  WebLogic 特定的用于会话 Bean 的可配置行为
有状态会话
支持
支持
有状态会话 EJB 群集行为是在  weblogic-ejb-jar.xml 中配置的。请参阅  WebLogic 特定的用于会话 Bean 的可配置行为
读写实体
支持
不支持
EJBHome 存根控件在可恢复调用失败的情况下不会进行故障转移。
方法执行期间不支持故障转移,只有在方法完成后,或者方法无法连接到服务器实例时,才支持进行故障转移。
读写 Bean 的 Home 会获取 Bean 的本地实例,并返回固定到本地服务器实例的存根控件。
实体群集行为是在  weblogic-ejb-jar.xml 中配置的。请参阅 群集元素
只读实体
支持
支持
EJBHome 存根控件在可恢复的调用失败的情况下不会进行故障转移。
实体群集行为是在  weblogic-ejb-jar.xml 中配置的。请参阅 群集元素
消息驱动
WebLogic Java 消息传递服务(WebLogic Java Messaging Service,简称 JMS)支持 JMS 服务器的群集。有关详细信息,请参阅 “使用 WebLogic Server 群集”中的  JMS 和群集

有关详细信息,请参阅“使用 WebLogic Server 群集”中的 EJB 和 RMI 的复制和故障转移和 EJB 和 RMI 对象的负载平衡

 


确保 EJB 安全

使用 WebLogic Server 安全功能,可控制对 EJB 的访问(授权),还可在 EJB 与其他应用程序组件及其他 EJB 交互时控制对 EJB 的标识的验证(身份验证)。

借助 WebLogic Server,应用程序开发人员能够使用 J2EE 和 WebLogic Server 部署描述符将安全性构建在其 EJB 应用程序中,系统管理员能够从 WebLogic Server 管理控制台控制 EJB 应用程序的安全性。后者可将开发人员从编写安全代码的工作中解脱出来,并为管理员提供了为以下内容定义安全策略的集中工具:整个企业应用程序(entire enterprise applications,简称EAR);包含多个 EJB 的一个 EJB JAR;该 JAR 中的特定 EJB;或该 EJB 中的一个方法。

有关安全和 EJB 的详细信息,请参阅:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值