EJB 容器的有状态会话 Bean 故障转移

可以使用 WebSphere® Application Server 来构造将使用有状态会话 Bean 的应用程序,这些有状态会话 Bean 不会受意外服务器故障的限制。该产品使用数据复制服务 (DRS) 和工作负载管理 (WLM) 功能,以使您可以启用有状态会话 Bean 故障转移。

因为您可能不想对安装在 Enterprise JavaBeans (EJB) 容器中的每个有状态会话 Bean 启用故障转移,所以您可以覆盖应用程序级别或者 EJB 模块级别的 EJB 容器设置。您可以在这些级别中的每个级别启用或禁用故障转移。例如,考虑以下各种情况:
  • 您要启用除单个应用程序以外的所有应用程序的故障转移。要完成这个任务,请您启用 EJB 容器级别的故障转移并覆盖应用程序级别的设置,以禁用单个应用程序的故障转移。
  • 您要启用单个已安装应用程序的故障转移。要完成这个任务,请您禁用 EJB 容器级别的故障转移,然后覆盖应用程序级别的设置,以启用单个应用程序的故障转移。
  • 您要启用除应用程序的单个模块以外的所有应用程序的故障转移。要完成这个任务,请您启用 EJB 容器级别的故障转移,然后覆盖模块应用程序级别的设置,以禁用单个模块的故障转移。
  • 您要启用单个已安装 EJB 模块的故障转移。要完成这个任务,请您禁用 EJB 容器级别的故障转移,然后覆盖 EJB 模块级别的设置,以启用单个 EJB 模块的故障转移。
有关从管理控制台启用有状态会话 Bean 故障转移的信息,请参阅下列主题:
  • 使用 EJB 容器面板启用或禁用有状态会话 Bean 故障转移
  • 使用企业应用程序面板启用或禁用有状态会话 Bean 故障转移
  • 使用 EJB 模块面板启用或禁用有状态会话 Bean 故障转移

已启用故障转移的有状态会话 Bean 激活策略

您可以指定在应用程序组装期间用于有状态会话 Bean 的激活策略。必须考虑到 EJB 容器准备好故障转移(通过使用 DRS 复制有状态会话 Bean 数据)的唯一时间是钝化有状态会话 Bean 的时候。如果您为 Bean 配置激活一次激活策略(这是缺省情况),那么该 Bean 不会足够迅速地钝化,因此对于有状态会话 Bean 故障转移无用。因此,当您启用故障转移时,EJB 容器将忽略为此 Bean 配置的激活策略,并自动使用在事务边界内激活激活策略。此操作将确保钝化该 Bean,一旦该 Bean 加入完成的事务,就会复制该 Bean 的数据。

避免故障 避免故障: 为 DRS 提供了要复制的数据时,DRS 就会将此数据复制到 N-1 个应用程序服务器,其中 N 是可用副本数。如果创建服务器和所有拥有该数据的备份副本的服务器失败或者已停止,那么所复制的数据会丢失,除非 DRS 使用者重新复制该数据。gotcha

有状态会话 Bean 在已启用故障转移的情况下使用容器管理的工作单元或 Bean 管理的工作单元

在这种情况下,相关工作单元是事务活动会话。该产品支持对容器管理的事务 (CMT)、Bean 管理的事务 (BMT)、容器管理的活动会话 (CMAS) 和 Bean 管理的活动会话 (BMAS) 进行有状态会话 Bean 故障转移。但是,在容器管理的案例中,仅当您发送请求以进行企业 Bean 方法调用,但是未导致与服务器建立连接时,才会准备进行故障转移。此外,如果服务器在接收并确认请求之后失败,那么不会进行故障转移。当在请求或工作单元过程中发生故障时,在应用程序不执行某个补偿代码的情况下,WLM 无法安全地将故障转移给另一台服务器。发生这种情况时,应用程序将接收到公共对象请求代理体系结构 (CORBA) 异常和次代码,它指出因为在执行工作单元期间发生了故障,所以不得进行明显的故障转移。您必须编写应用程序来检查 CORBA 异常和次代码,并对故障进行补偿。执行补偿代码之后,该应用程序可以重试请求,如果存在备份服务器的路径,那么 WLM 会为有状态会话 Bean 将新请求传递到新的主服务器。

[AIX Solaris HP-UX Linux Windows][IBM i]有关更多信息,请参阅“CORBA 次代码”主题。

有关更多信息,请参阅“除 z/OS® 之外的所有平台的工作负载管理”主题。

对于 Bean 管理的工作单元(例如,事务或活动会话)也是如此。但是,Bean 管理的工作引入了新的可能性,必须加以考虑。

对于 Bean 管理的工作单元,故障转移过程并不是始终都能够检测到由有状态会话 Bean 方法启动的 BMT 或 BMAS 尚未完成。因此,尽管工作单元在事务或会话期间失败,但新的服务器还是有可能发生故障转移。由于工作单元隐式回滚,因此 WLM 似乎可以安全地将故障显式转移至另一台服务器,而实际上此时可能需要某个修补代码。发生这种情况时,EJB 容器将在新的服务器上检测到此行为并发出异常。此异常在以下情况中发生:
  1. 使用 Bean 管理的事务或活动会话的有状态会话 Bean 的方法将对它从 SessionContext 对象获得的 UserTransaction 调用 begin 方法。此方法在启动的工作单元中完成某些工作,但在返回到此方法的调用者之前不会完成事务或会话。
  2. 开始调用该方法之后,EJB 容器会暂挂该方法已启动的工作。当 Bean 为有状态会话 Bean 时,此操作是 Bean 管理的工作单元按照 Enterprise JavaBeans 规范需要执行的操作。
  3. 客户机在有状态会话 Bean 上启动一些其他的方法。每个调用都会导致 EJB 容器恢复暂挂事务或活动会话,分派方法调用,并随后在返回至调用者之前再次暂挂工作。
  4. 客户机在完成步骤 1 中启动的事务或会话的有状态会话 Bean 上调用方法。

此情况描述了粘性 Bean 管理的工作单元。事务或活动会话等待多个有状态会话 Bean 方法。如果应用程序使用粘性 BMT 或 BMAS,并且服务器在粘性工作单元完成之后及另一个粘性工作单元启动之前失败,那么故障转移成功。但是,如果此服务器在粘性事务或活动会话完成之前失败,那么故障转移不成功。取而代之的是,当故障转移过程将有状态会话 Bean 请求路由至新的服务器时,EJB 容器检测出在活动的粘性事务或活动会话期间发生故障。此时,EJB 容器发出异常。

此过程表明,如果事务或者活动会话仍然处于活动状态,那么容器管理的工作单元和 Bean 管理的工作单元的故障转移都不成功。唯一的差别是 Bean 管理的工作单元发生异常。

应用程序设计注意事项

在设计将使用有状态会话 Bean 故障转移过程的应用程序时,请考虑以下信息:
  • 为了避免发生前一节中所描述的异常,建议您编写应用程序时将有状态会话 Bean 配置为使用容器管理的事务 (CMT),而不使用 Bean 管理的事务 (BMT)。
  • 如果您想要进行故障转移,并且应用程序将创建用于存储对于另一个有状态会话 Bean 的引用的 HTTP 会话或者有状态会话 Bean,那么管理员必须确保将 HTTP 会话和有状态会话 Bean 配置为使用同一数据复制服务 (DRS) 复制域。
  • 请勿对同一有状态会话 Bean 使用本地引用和远程引用。

    通常,在任何给定时间内,带有给定主键的有状态会话 Bean 实例只能在单个服务器上存在。故障转移可能使 Bean 从一台服务器移动至另一台服务器,但它绝对不会于同一时间在多个服务器上存在。但是,某些不可能发生的情况可能会导致同一 Bean 实例(同一主键)同时存在于多个服务器中。发生这种情况时,Bean 的每个副本都不知道存在另一个副本,并且这两个实例之间未进行同步以确保它们具有同一状态数据。因此,应用程序接收到不可预测的结果。

    注意: 为了避免发生这种情况,您必须记住:在启用故障转移的情况下,应用程序决不能对同一有状态会话 Bean 实例同时进行本地引用 (EJBLocalObject) 和远程引用 (EJBObject)。
  • 应避免对有状态会话 Bean 使用远程异步方法。

    调用异步方法时,远程服务器会将异步方法请求进行排队,并将一个“将来的”对象返回给客户机。因为该方法请求仅在具备有状态会话 Bean 实例的服务器上进行排队,所以该“将来的”对象会绑定到该服务器,而不会进行故障转移。如果您需要对有状态会话 Bean 使用远程异步方法,请编写应用程序以检测对于该“将来的”对象的调用何时失败,并对该有状态会话 Bean 进行同步调用,以确定是否已成功完成异步方法所启动的事务。

  • 在启用故障转移的情况下,应避免引用有状态会话 Bean 中的非持久 EJB 计时器。

    如果有状态会话 Bean 中包括自动创建或者通过程序创建的非持久计时器实例的句柄,那么在该有状态会话 Bean 进行故障转移以及在使用此句柄时发生 javax.ejb.NoSuchObjectLocalException 异常之后,此句柄将变得无效。如果应用程序需要引用有状态会话 Bean 中的非持久计时器,请编写应用程序以考虑无效句柄。

    注意: 有状态会话 Bean 中自动创建或者通过程序创建的持久计时器的句柄将进行故障转移,在有状态会话 Bean 进行故障转移之后可以使用该句柄。
[z/OS]

仅适用于 z/OS 用户

WebSphere Application Server Network Deployment for z/OS 上,有状态会话 Bean 故障转移与 WebSphere Application Server Network Deployment 产品上的情况稍有不同。除了此处讨论的故障转移解决方案以外,z/OS 用户还可在非受管服务器上的服务方之间启用故障转移。有关更多信息,请参阅下列主题:
  • 多个服务方
  • 设置对等重新启动和恢复
  • 可能会部署有状态会话 Bean 的集群

因为 z/OS 产品具有控制区域和服务方区域,而 WebSphere Application Server Network Deployment 产品没有这些区域,所以存在对于 z/OS 而言是唯一的故障转移情况,也就是从一个服务方区域故障转移到另一个服务方区域(失去服务方,而不失去控制器)。

如果您在 z/OS 上使用基于 HFS 的技术,那么继续使用该技术。

在非受管 z/OS 服务器中,可以在服务方之间启用有状态会话 Bean 故障转移。故障转移仅在给定非受管服务器的服务方之间进行。如果非受管 z/OS 服务器只有一个服务方,那么启用故障转移不起作用。启用了故障转移的非受管 z/OS 服务器不会故障转移到另一个非受管 z/OS 服务器。要在非受管服务器中启用故障转移,请参阅“对非受管服务器中的服务方启用故障转移”。


指示主题类型的图标 概念主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cejb_sfsbf
文件名:cejb_sfsbf.html