事务补偿和业务活动支持

业务活动是一组任务,他们将链接在一起以便能得到一致的结果。与原子事务不同,一些发送电子邮件之类的活动可能很难自动回滚或不可能自动回滚,因此在发生错误时需要补偿进程。WebSphere® Application Server 业务活动支持通过业务活动范围来提供此补偿功能。

何时使用业务活动支持

当某一应用程序需要补偿时,那么使用业务活动支持。如果某一应用程序的操作不能自动回滚,那么此应用程序需要补偿。通常,此情况是由于下列其中一个原因造成的:
  • 应用程序使用多个非扩展体系结构 (XA) 资源。
  • 该应用程序使用多个原子事务,如一些企业 Bean,他们将需要新的用作容器事务部署描述符中事务字段的设置。
  • 应用程序未在全局事务中运行。
下图显示使用业务活动支持的简单 Web Service 应用程序。零售商、仓库和制造服务在非 WebSphere Application Server 环境中运行。零售商服务调用在 WebSphere Application Server 上运行的供应商服务,而供应商服务将任务委派给仓库和制造服务。供应商服务的实现包含无状态会话 Bean,它将调用其他与仓库和制造服务相关联及执行可补偿工作的无状态会话 Bean。这些其他会话 Bean 中的每一个都具有补偿处理程序;这是在运行时与应用程序组件相关联的一个逻辑,它将执行重新发送电子邮件之类的补偿活动。
请参阅描述文本。

应用程序设计

业务活动上下文将使用应用程序消息进行传播,因此会分发到不在同一服务器上的应用程序组件中。与原子事务上下文不同,业务活动上下文将在同步(分块)调用/响应消息和单向异步消息上传播。在业务活动范围中运行的应用程序组件将负责确保在完成组件自己的处理之前,它启动的任何异步任务已完成。因为对于使用射后不理消息模式启动异步任务的应用程序,无法检测此异步处理是否完成,所以这类应用程序一定不能使用业务活动范围。

只有具有容器管理事务的企业 Bean 才能使用业务活动功能。使用业务活动作用域的企业 Bean 不仅能够提供 Web Service 接口,还能够提供标准企业 Bean 本地或远程 Java™ 接口。 业务活动上下文将通过使用标准的可互操作 Web Service 业务活动 (WS-BA) CoordinationContext 元素在 Web Service 消息中传播。未使用 Web Service 时,WebSphere Application Server 也可将 RMI 调用上的业务活动上下文传播到企业 Bean,但此形式的上下文不能与非 WebSphere Application Server 环境互操作。如果需要对企业内部的应用程序进行补偿,那么您可能需要使用这一不同种类的方案。如果想要在异构环境中使用业务活动补偿,那么将应用程序组件显示为 Web Service。

业务活动上下文可穿过防火墙传播,也可以在 WebSphere Application Server 域外部传播。用来实现此传播的拓扑会影响业务活动事务的高可用性和亲缘关系行为。

应用程序开发和部署

WebSphere Application Server 提供了一个编程模型,以用于创建业务活动作用域及将补偿处理程序与这些业务活动作用域相关联。WebSphere Application Server 还提供了一个应用程序编程接口,以指定补偿数据及检查或改变业务活动的状态。要使用业务活动支持,必须相应地设置特定应用程序部署描述符,在必要时提供补偿处理程序类,并在任何运行该应用程序的服务器上启用业务活动支持。
注: 仅当将应用程序部署到处于 V6.1 或更高版本的 WebSphere Application Server 时,这些应用程序才能使用业务活动支持。如果将应用程序部署到包括 WebSphere Application Server V6.0.x 服务器的集群,那么这些应用程序不能使用业务活动支持。

业务活动范围

业务活动的作用域是主 WebSphere Application Server 工作单元的作用域:全局事务、活动会话或局部事务包含范围 (LTC)。业务活动范围不是新的工作单元 (UOW);它是现有主 UOW 的属性。因此,业务活动范围与 UOW 之间存在一对一的关系。

在 WS-BA 部署中,UOW 必须由容器管理:
  • UOW 可以是创建了全局事务的容器管理的事务 (CMT) 企业 Bean。
  • UOW 可以是局部事务包含范围 (LTC),在此范围中,容器负责发起和结束资源管理器局部事务 (RMLT)。即,在事务部署描述符属性中,局部事务属性 Resolver 必须设置为 ContainerAtBoundary。要使用 WS-BA,不能将 Resolver 属性设置为 Application。
任何主 UOW 都与一个业务活动范围相关联。如果在与业务活动范围相关联的 UOW 中运行的组件调用另一组件,那么该请求会传播业务活动范围;新组件完成的任何工作将与调用组件相同的业务活动范围相关联。例如,如果企业 Bean 的事务设置为需要新的,或者与调用组件在同一 UOW 中运行,那么被调用组件可创建新的 UOW。如果启动新的 UOW,那么将创建新的业务活动范围并且将其与新的 UOW 相关联。新创建的业务活动范围是与调用 UOW 相关联的业务活动范围的子代。在下图中,在 UOW1 中运行的 EJB1a 将调用以下两个组件:同时在 UOW1 中运行的 EJB1b,以及用于创建新 UOW(即 UOW2)的 EJB2。企业 Bean EJB1b 调用另一个企业 Bean EJB3,而 EJB3 将再次创建新的 UOW,即 UOW3。因为每个新的 UOW 都将通过一个调用组件(其 UOW 已与业务活动范围 BAScope1 相关联)创建,所以新创建的 UOW 与新的内部业务活动范围 BAScope2 和 BAScope3 相关联。
请参阅描述文本。

内部业务活动范围必须先完成,外部业务活动范围才能完成。内部业务活动范围(如 BAScope2)与外部业务活动范围(在此例中为 BAScope1)相关联。如果每个业务活动范围的关联 UOW 成功完成,那么将指示该业务活动范围关闭;如果其关联 UOW 失败,那么将指示该业务活动范围进行补偿。如果 BAScope2 成功完成,那么 BAScope2 所拥有的任何活动补偿处理程序将移至 BAScope1,并且指示 BAScope2 补偿或关闭,其方式与指示 BAScope1 完成的方式一样。如果 BAScope2 失败,那么活动补偿处理程序将自动补偿,并且不会将任何内容移至外部 BAScope1。当内部业务活动范围由于其关联 UOW 失败而失败时,会将应用程序服务器异常抛出至在外部 UOW 中运行的调用应用程序组件。

例如,如果内部 UOW 失败,它可能会抛出 TransactionRolledBackException 异常。如果调用应用程序可处理该异常(例如通过重试被调用组件或通过调用另一组件),即使内部业务活动范围失败,调用 UOW 及其关联业务活动范围也可成功完成。如果应用程序设计要求调用 UOW 失败以便补偿其关联业务活动范围,那么调用应用程序组件必须导致其 UOW 失败,如允许其容器处理失败 UOW 中的任何系统异常。

当外部业务活动范围完成时,其成功或失败将确定外部业务活动范围所拥有的任何活动补偿处理程序(包括通过内部业务活动范围的成功完成而提升的那些补偿处理程序)的完成指示,即关闭或补偿。如果外部业务活动范围成功完成,那么它会驱动所有活动补偿处理程序关闭。如果外部业务活动范围失败,那么它会驱动所有活动补偿处理程序进行补偿。

此补偿行为将在下表中进行总结。
表 1. 单个业务活动范围的补偿行为. 该表列出了内部和外部业务活动范围的成功和失败的可能组合,以及与每种组合关联的补偿行为。
内部业务活动范围 外部业务活动范围 补偿行为
成功 成功 内部业务活动范围所拥有的任何补偿处理程序都将等待外部 UOW 完成。当外部 UOW 成功时,外部业务活动范围将驱动所有补偿处理程序完成。
失败 成功 将补偿内部业务活动范围所拥有的任何补偿处理程序。某一异常被抛出至外部 UOW;如果捕获到此异常,那么在外部 UOW 成功时,外部业务活动范围将驱动所有余下补偿处理程序关闭。
失败 失败 将补偿内部业务活动范围所拥有的任何补偿处理程序。某一异常被抛出至外部 UOW;如果未捕获到此异常,那么外部业务活动范围将失败。当外部业务活动范围由于未处理异常或某些其他原因失败时,将补偿所有余下活动补偿处理程序。
成功 失败 内部业务活动范围所拥有的任何补偿处理程序都将等待外部 UOW 完成。当外部 UOW 失败时,外部业务活动范围将驱动所有补偿处理程序进行补偿。

当带有关联业务活动范围的 UOW 完成时,该业务活动范围将始终按与其相关联的 UOW 的指示来完成。唯一能够影响业务活动范围的指示的方法是影响与其相关联的 UOW,可通过使用业务活动 API 的 setCompensateOnly 方法来实现这一点。

在事务 UOW 中注册的补偿处理程序一开始可能处于不活动状态,这取决于从业务活动 API 调用的方法。当声明该处理程序的 UOW 成功完成时,在此情况下处于不活动状态的处理程序将变为活动状态。在事务 UOW 外部注册的补偿处理程序始终会立即变为活动状态。有关更多信息,请参阅有关业务活动 API 的主题。

图中的每个业务活动范围表示一个业务活动。例如,在 BAScope1 中运行的外部业务活动可以是假期预订方案,而 BAScope2 是机票预订方案,BAScope3 是酒店预订方案。如果机票或酒店预订失败,那么在缺省情况下整个假期预订也会失败。另外,如果机票预订失败,您可能希望应用程序尝试使用提供不同航线的另一组件来预订机票。如果整个假期预订失败,那么应用程序可使用补偿处理程序来取消已成功预订的所有机票和酒店。

应用程序组件对业务活动范围的使用

在缺省情况下,应用程序组件不使用业务活动范围。使用 WebSphere Application Server 组装工具来指定使用业务活动范围,并标识该组件的任何补偿处理程序类:
缺省配置
如果业务活动上下文在某一没有业务活动范围配置的组件所接收到的请求上,那么容器会存储该上下文,但在目标组件的方法范围期间决不会使用它。不会创建新的业务活动范围。如果目标组件调用另一组件,那么会传播存储的业务活动上下文,并且其他补偿组件会使用该上下文。
在业务活动范围中运行企业 Bean 方法
入局请求上的任何业务活动上下文将被容器接收并且对目标组件可用。例如,如果由于企业 Bean 方法的事务设置为需要新的而对目标方法创建新的 UOW,那么接收到的业务活动范围将成为新创建业务活动的外部业务活动范围。如果从调用组件传播该 UOW 并且由该方法使用该 UOW,那么接收到的业务活动范围将由该方法使用。如果调用时不存在业务活动范围,那么该方法会创建并使用新的业务活动范围。
要在调用企业 Bean 时创建业务活动范围,那么必须配置企业 Bean 以在业务活动范围中运行企业 Bean 方法。还必须对要调用的方法配置部署描述符,以指定在调用时创建新的 UOW。有关详细信息,请参阅有关创建使用 WS-BA 支持的应用程序的主题。

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



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