补偿可以用来撤消或补偿已经完成的更新。补偿服务收回已提交的更新或者采取相反的措施。例如,如果工作流中的一个活动更新了数据库,那么相应的补偿操作将反转这个更新。如果这个活动是发送一封电子邮件给客户,那么补偿行为将发送另外一封电子邮件来通知该客户前一封电子邮件是无效的。
在工作流中,每个服务活动可能都有一个与之相关联的补偿服务。这个服务活动称为转发服务 (forward service),当流程运行转发时调用。补偿服务仅当转发服务完成时才调用。当流程中发生故障时,执行可选的补偿服务来补偿转发服务的行为。请参阅侧栏补偿的工作方式以了解更多的详细信息。
在我们的 OTMPS 场景中,客户可以提交一批待完成的订单。他们期望,或者所有的订单都转发给制造厂,或者一个也没有转发。在确认了所有的订单后,每个订单都发送给正确的制造厂去执行。如果任何一家制造厂拒绝或无法处理订单,那么这批订单的整个制造流程就会撤消,并且系统会向客户通知这个问题。正如下面的图 1 所示,工作流的这一部分是由一个称为“制造循环 (Manufacturing Loop)”的“while”循环组成的。这个循环一直运行,直到处理完所有的订单为止。根据整个服务“Manufacture Plant 1”中的制造厂策略,将每个订单发送到 while 循环内相应的制造厂。
图 1. OMPTS 处理流程
在 OTMPS 中,您需要向订单处理微流 (micro-flow) 添加补偿服务,具体来说就是 Manufacture Plant 1 服务。这个补偿服务向制造厂的管理者发送电子邮件,通知他或她取消先前的订单。
要向活动添加补偿服务,请遵循以下步骤:
- 创建补偿服务的接口 (Interface)。
- 实现补偿 (Compensation) 服务。
- 添加补偿服务的伙伴链接 (Partner Link)。
- 指定转发服务的补偿 (Compensation)。
- 指定流程的补偿域 (Compensation Sphere) 属性。
让我们更详细地分析这些步骤:
补偿服务与转发服务类似。如果它不存在,则需要为补偿服务创建服务接口。要定义接口,您可以直接使用 Web 服务描述语言(Web Services Description Language,WSDL)向导,或者使用 IBM® WebSphere® Studio Application Developer Integration Edition 工具从 Java™ 类构建它。
您可以使用与用于转发服务相同的方法来定义补偿服务的输入消息。补偿服务所返回的信息和它的输出消息对流程没有任何影响,因此被业务流程编排器 (Business Process Choreographer)(BPEL 工作流引擎)丢弃。详细信息请参考 How is the compensation service input message assembled?。
在我们的 OTMPS 场景中,您需要为 Manufacture Plant 1 服务的补偿服务创建服务接口。接口文件的名称是 OrderCompensation.wsdl,如下面的图 2 所示。这个接口有一个称为“revokeOrder”的操作。这个操作没有输出消息。补偿服务的输入消息提供服务发送电子邮件所需的信息。这个信息在转发服务的输入消息“ManufactureIn”中可以获得。所以,将补偿服务的输入消息设置为转发服务的输入消息。
图 2. 补偿服务的接口
在这一步中,您将使用 WebSphere Studio Application Developer Integration Edition 为在上一步骤中创建的服务接口生成必需的服务骨架。
- 右键单击 Service Interface 文件。
- 选择菜单项 Build from service。
- 在 New Service Skeleton 窗口中,选择 Service Type。
在我们的示例中,我们将补偿服务作为 Java 服务来实现。所以,您需要选择“Java Service Skeleton”。这一步生成了 Java 类“OrderCompensation”。清单 1 显示了生成的 Java 类。
清单 1. 补偿服务的 Java 服务骨架
public class OrderCompensation {
/**
* @generated
*/
public OrderCompensation() {
// user code begin {constructor_content}
// user code end
}
/**
* revokeOrder
* @generated
*/
public void revokeOrder(Services.ManufactureIn argServiceRequestPart)
{
// user code begin {method_content}
// user code end
}
}
|
在“user code begin”和“user code end”之间,添加撤消订单的代码。这个实现可以调用函数来更新数据库,或者执行其他的业务流程来补偿前面的执行操作。在我们的示例中,没有直接的服务供您调用来撤消已提交的订单。这个实现是发送一封电子邮件给制造厂的管理者,通知他或她取消前面的订单。
您需要伙伴链接以便将补偿服务添加到流程中。所以,在流程中添加伙伴链接 RevokeOrder。图 3 显示了伙伴链接实现的屏幕显示。
图 3. 添加伙伴链接
接着,您将向 Manufacture Plant 1 服务添加补偿服务。请遵循以下步骤:
- 选择 Manufacture Plant 1 活动。
- 单击 Compensation Property 选项卡。
- 分别将 Partner Link、Port Type 和 Operation 设置为 RevokeOrder、OrderCompensation 和 revokeOrder。
- 补偿操作 revokeOrder 的数据已经可以从转发服务的输入消息中获得。所以,您将转发服务的输入变量 ManufacturingLoopManufacturePlant1InputCriteriaVariable 用于补偿服务。
Manufacture Plant 1 服务活动并不参与这个事务。正如下面的图 4 所示,不应该选中属性“Activity Takes Part in Transaction”。在微流中,如果事务失败,则参与事务的活动将回滚。在这种情况下,事务内部并不需要补偿服务活动。只有未参与事务的活动才需要补偿服务,例如,发送电子邮件。其他类型的需要补偿的活动是那些调用不支持分布式事务的远程服务器上的服务的活动。在我们的示例中,工作流通过像 FTP 或 MQ 这样的协议调用远程制造厂服务。这个活动没有参与全局事务。
图 4. 指定补偿服务
为了触发补偿,补偿域必须是可用的。当启动业务流程时,由业务流程执行的可补偿活动集的范围就设置好了。这个定义的范围称为补偿域。正如下面的图 5 所示,您可以在 Server 设置中的流程属性单上指定补偿域的设置。
图 5. 补偿域设置
微流的可能选择是“Supports”和“Required”。如果补偿域设置为 Supports,那么它将使用父流程的补偿域。如果它本身是顶部流程,补偿服务将禁用。所以,为了启用补偿服务,您不得不使用 Required 设置。在这种情况下,如果没有补偿域,那么就将创建一个新的补偿域。
一旦活动成功地完成,它的补偿服务就可以执行。您可以显式地或隐式地调用补偿。当抛出故障时触发隐式补偿,这个故障或者被为顶层流程定义的故障处理程序捕获或者未被其捕获。
显式调用可能发生在任何地方。您可以使用流程编排器 API(应用程序编程接口)显式地终止带有补偿请求的流程实例。有关流程编排器 API 的详细信息,请参考 com.ibm.bpe.api 包中的 WebSphere Application Server API 规范。宏流 (macro-flow) 的补偿服务可以显式地或者隐式地触发,而微流的补偿服务只能隐式地触发。
例如,在这个 OTMPS 场景中,“OrderProcessSystem”流程是微流。当发生异常时,整个工作流失败,事务回滚。因为补偿域已启用,所以所有成功完成但不属于全局事务的活动都将补偿。正如前面所提到的,Manufacture Plant 1 活动并不是全局事务的一部分,因此在补偿服务 OrderCompensation 中定义的 revokeOrder 操作将被调用。这个补偿服务被安排向制造厂的管理者发送电子邮件来通知他或她取消前面的订单。
本文描述了流程编排器中的补偿服务以及它在 OTMPS 场景中的使用。还举例说明了如何在工作流中添加补偿以及触发补偿服务。
作者感谢 Joshy Joseph 和 Susan Herrmann 对本文提供的帮助。
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文。
- 请阅读随需应变的业务流程生命周期的所有部分,并关注我们新增的部分。
- 要了解更多关于补偿的知识,请参阅下列文章和参考资料:
- Business process choreography in WebSphere: Combining the power of BPEL and J2EE(IBM Systems 期刊,2004 年)。
- Websphere Application Server 信息中心。
- IBM WebSphere Developer 技术期刊: WebSphere Business Integration Server Foundation Process Choreographer 中的建模补偿(IBM WebSphere 开发者技术期刊,2004 年)。
- Create compensation in a business process(developerWorks 教程,2004 年 6 月)。
- How is the compensation service input message assembled?(IBM Support,Technote,2004 年)。
- 请访问 Developer Bookstore 以获得完整的技术书籍清单,其中包括数百本关于 Web 服务主题的书籍。
- 通过参与 developerWorks 博客加入到 developerWorks 社区。
- 想了解更多内容吗?developerWorks SOA and Web services 专区有数百篇关于如何开发 Web 服务应用程序的文章以及入门级、中级和高级教程,将让您大开眼界。
Wei Liu 是来自 IBM Software Group 的一位软件工程师。目前,她在 IBM On Demand 开发团队工作。她擅长的领域包括 WebSphere 应用服务器、Web 服务和工作流开发。您可以通过 liuwei@us.ibm.com 与她联系。
GermÁn Goldszmidt 博士是 IBM Software Group 的一名高级技术人员,他主要专注于用于交付、自定义和部署随需应变解决方案的集成平台的架构。以前,他是 IBM T.J. Watson Research Center 的一位研究员,曾领导过若干技术的设计和实现,其中包括 Oceano,第一个原型自动计算 eUtility 以及 Network Dispatcher——WebSphere 产品的负载均衡组件。您可以通过 gsg@us.ibm.com 与他联系。