事务补偿和业务活动支持
业务活动是一组任务,他们将链接在一起以便能得到一致的结果。与原子事务不同,一些发送电子邮件之类的活动可能很难自动回滚或不可能自动回滚,因此在发生错误时需要补偿进程。WebSphere® Application Server 业务活动支持通过业务活动范围来提供此补偿功能。
何时使用业务活动支持
- 应用程序使用多个非扩展体系结构 (XA) 资源。
- 该应用程序使用多个原子事务,如一些企业 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 还提供了一个应用程序编程接口,以指定补偿数据及检查或改变业务活动的状态。要使用业务活动支持,必须相应地设置特定应用程序部署描述符,在必要时提供补偿处理程序类,并在任何运行该应用程序的服务器上启用业务活动支持。业务活动范围
业务活动的作用域是主 WebSphere Application Server 工作单元的作用域:全局事务、活动会话或局部事务包含范围 (LTC)。业务活动范围不是新的工作单元 (UOW);它是现有主 UOW 的属性。因此,业务活动范围与 UOW 之间存在一对一的关系。
- UOW 可以是创建了全局事务的容器管理的事务 (CMT) 企业 Bean。
- UOW 可以是局部事务包含范围 (LTC),在此范围中,容器负责发起和结束资源管理器局部事务 (RMLT)。即,在事务部署描述符属性中,局部事务属性 Resolver 必须设置为 ContainerAtBoundary。要使用 WS-BA,不能将 Resolver 属性设置为 Application。

内部业务活动范围必须先完成,外部业务活动范围才能完成。内部业务活动范围(如 BAScope2)与外部业务活动范围(在此例中为 BAScope1)相关联。如果每个业务活动范围的关联 UOW 成功完成,那么将指示该业务活动范围关闭;如果其关联 UOW 失败,那么将指示该业务活动范围进行补偿。如果 BAScope2 成功完成,那么 BAScope2 所拥有的任何活动补偿处理程序将移至 BAScope1,并且指示 BAScope2 补偿或关闭,其方式与指示 BAScope1 完成的方式一样。如果 BAScope2 失败,那么活动补偿处理程序将自动补偿,并且不会将任何内容移至外部 BAScope1。当内部业务活动范围由于其关联 UOW 失败而失败时,会将应用程序服务器异常抛出至在外部 UOW 中运行的调用应用程序组件。
例如,如果内部 UOW 失败,它可能会抛出 TransactionRolledBackException 异常。如果调用应用程序可处理该异常(例如通过重试被调用组件或通过调用另一组件),即使内部业务活动范围失败,调用 UOW 及其关联业务活动范围也可成功完成。如果应用程序设计要求调用 UOW 失败以便补偿其关联业务活动范围,那么调用应用程序组件必须导致其 UOW 失败,如允许其容器处理失败 UOW 中的任何系统异常。
当外部业务活动范围完成时,其成功或失败将确定外部业务活动范围所拥有的任何活动补偿处理程序(包括通过内部业务活动范围的成功完成而提升的那些补偿处理程序)的完成指示,即关闭或补偿。如果外部业务活动范围成功完成,那么它会驱动所有活动补偿处理程序关闭。如果外部业务活动范围失败,那么它会驱动所有活动补偿处理程序进行补偿。
内部业务活动范围 | 外部业务活动范围 | 补偿行为 |
---|---|---|
成功 | 成功 | 内部业务活动范围所拥有的任何补偿处理程序都将等待外部 UOW 完成。当外部 UOW 成功时,外部业务活动范围将驱动所有补偿处理程序完成。 |
失败 | 成功 | 将补偿内部业务活动范围所拥有的任何补偿处理程序。某一异常被抛出至外部 UOW;如果捕获到此异常,那么在外部 UOW 成功时,外部业务活动范围将驱动所有余下补偿处理程序关闭。 |
失败 | 失败 | 将补偿内部业务活动范围所拥有的任何补偿处理程序。某一异常被抛出至外部 UOW;如果未捕获到此异常,那么外部业务活动范围将失败。当外部业务活动范围由于未处理异常或某些其他原因失败时,将补偿所有余下活动补偿处理程序。 |
成功 | 失败 | 内部业务活动范围所拥有的任何补偿处理程序都将等待外部 UOW 完成。当外部 UOW 失败时,外部业务活动范围将驱动所有补偿处理程序进行补偿。 |
当带有关联业务活动范围的 UOW 完成时,该业务活动范围将始终按与其相关联的 UOW 的指示来完成。唯一能够影响业务活动范围的指示的方法是影响与其相关联的 UOW,可通过使用业务活动 API 的 setCompensateOnly 方法来实现这一点。
在事务 UOW 中注册的补偿处理程序一开始可能处于不活动状态,这取决于从业务活动 API 调用的方法。当声明该处理程序的 UOW 成功完成时,在此情况下处于不活动状态的处理程序将变为活动状态。在事务 UOW 外部注册的补偿处理程序始终会立即变为活动状态。有关更多信息,请参阅有关业务活动 API 的主题。
图中的每个业务活动范围表示一个业务活动。例如,在 BAScope1 中运行的外部业务活动可以是假期预订方案,而 BAScope2 是机票预订方案,BAScope3 是酒店预订方案。如果机票或酒店预订失败,那么在缺省情况下整个假期预订也会失败。另外,如果机票预订失败,您可能希望应用程序尝试使用提供不同航线的另一组件来预订机票。如果整个假期预订失败,那么应用程序可使用补偿处理程序来取消已成功预订的所有机票和酒店。
应用程序组件对业务活动范围的使用
- 缺省配置
- 如果业务活动上下文在某一没有业务活动范围配置的组件所接收到的请求上,那么容器会存储该上下文,但在目标组件的方法范围期间决不会使用它。不会创建新的业务活动范围。如果目标组件调用另一组件,那么会传播存储的业务活动上下文,并且其他补偿组件会使用该上下文。
- 在业务活动范围中运行企业 Bean 方法
- 入局请求上的任何业务活动上下文将被容器接收并且对目标组件可用。例如,如果由于企业 Bean 方法的事务设置为需要新的而对目标方法创建新的 UOW,那么接收到的业务活动范围将成为新创建业务活动的外部业务活动范围。如果从调用组件传播该 UOW 并且由该方法使用该 UOW,那么接收到的业务活动范围将由该方法使用。如果调用时不存在业务活动范围,那么该方法会创建并使用新的业务活动范围。