跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

随需应变的业务流程生命周期,第 12 部分: 实现补偿服务

Wei Liu (liuwei@us.ibm.com), 软件工程师, IBM
Wei Liu 是来自 IBM Software Group 的一位软件工程师。目前,她在 IBM On Demand 开发团队工作。她擅长的领域包括 WebSphere 应用服务器、Web 服务和工作流开发。您可以通过 liuwei@us.ibm.com 与她联系。
GermÁn Goldszmidt (gsg@us.ibm.com), 高级技术人员, IBM
GermÁn Goldszmidt 博士是 IBM Software Group 的一名高级技术人员,他主要专注于用于交付、自定义和部署随需应变解决方案的集成平台的架构。以前,他是 IBM T.J. Watson Research Center 的一位研究员,曾领导过若干技术的设计和实现,其中包括 Oceano,第一个原型自动计算 eUtility 以及 Network Dispatcher——WebSphere 产品的负载均衡组件。您可以通过 gsg@us.ibm.com 与他联系。

简介: 学习如何使用流程补偿服务 (process compensation service) 来实现业务流程执行语言(Business Process Execution Language,BPEL)工作流。Wei Liu 和 GermÁn Goldszmidt 博士描述了如何创建和调用补偿活动来撤消由流程活动所做出的更新。本系列的第 1 部分介绍了用于制造业订单处理系统(Order to Manufacturing Processing System,OTMPS)的随需应变的业务流程场景。本文详细叙述了您在最初的文章以及其余部分中学到的内容,并且描述了如何使用补偿服务来扩展工作流。

发布日期: 2005 年 8 月 12 日
级别: 初级
访问情况 : 857 次浏览
评论: 


补偿服务

补偿可以用来撤消或补偿已经完成的更新。补偿服务收回已提交的更新或者采取相反的措施。例如,如果工作流中的一个活动更新了数据库,那么相应的补偿操作将反转这个更新。如果这个活动是发送一封电子邮件给客户,那么补偿行为将发送另外一封电子邮件来通知该客户前一封电子邮件是无效的。

补偿的工作方式

当一个服务活动完成时,如果已经定义了补偿服务,那么就向工作流的补偿域 (Compensation Sphere) 注册补偿服务及其输入数据。在流程实例结束时,补偿域查看是否抛出了故障。如果这个流程成功地完成,那么就不需要补偿任何活动。另一方面,如果这个流程失败了,那么您就需要执行补偿。如果需要任何流程补偿,补偿域就会调用它在后进先出 (last-in first-out) 队列(与转发服务完成的次序相反)中注册的补偿服务。

在工作流中,每个服务活动可能都有一个与之相关联的补偿服务。这个服务活动称为转发服务 (forward service),当流程运行转发时调用。补偿服务仅当转发服务完成时才调用。当流程中发生故障时,执行可选的补偿服务来补偿转发服务的行为。请参阅侧栏补偿的工作方式以了解更多的详细信息。


OTMPS 场景中的补偿服务

在我们的 OTMPS 场景中,客户可以提交一批待完成的订单。他们期望,或者所有的订单都转发给制造厂,或者一个也没有转发。在确认了所有的订单后,每个订单都发送给正确的制造厂去执行。如果任何一家制造厂拒绝或无法处理订单,那么这批订单的整个制造流程就会撤消,并且系统会向客户通知这个问题。正如下面的图 1 所示,工作流的这一部分是由一个称为“制造循环 (Manufacturing Loop)”的“while”循环组成的。这个循环一直运行,直到处理完所有的订单为止。根据整个服务“Manufacture Plant 1”中的制造厂策略,将每个订单发送到 while 循环内相应的制造厂。


图 1. OMPTS 处理流程
图 1. OMPTS 处理流程

在 OTMPS 中,您需要向订单处理微流 (micro-flow) 添加补偿服务,具体来说就是 Manufacture Plant 1 服务。这个补偿服务向制造厂的管理者发送电子邮件,通知他或她取消先前的订单。


添加补偿服务

要向活动添加补偿服务,请遵循以下步骤:

  1. 创建补偿服务的接口 (Interface)
  2. 实现补偿 (Compensation) 服务。
  3. 添加补偿服务的伙伴链接 (Partner Link)
  4. 指定转发服务的补偿 (Compensation)
  5. 指定流程的补偿域 (Compensation Sphere) 属性。

让我们更详细地分析这些步骤:

步骤 1:创建补偿服务的接口

补偿服务与转发服务类似。如果它不存在,则需要为补偿服务创建服务接口。要定义接口,您可以直接使用 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. 补偿服务的接口
图 2. 补偿服务的接口

步骤 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”之间,添加撤消订单的代码。这个实现可以调用函数来更新数据库,或者执行其他的业务流程来补偿前面的执行操作。在我们的示例中,没有直接的服务供您调用来撤消已提交的订单。这个实现是发送一封电子邮件给制造厂的管理者,通知他或她取消前面的订单。

步骤 3:添加补偿服务的伙伴链接

您需要伙伴链接以便将补偿服务添加到流程中。所以,在流程中添加伙伴链接 RevokeOrder。图 3 显示了伙伴链接实现的屏幕显示。


图 3. 添加伙伴链接
图 3. 添加伙伴链接

步骤 4: 指定转发服务的补偿

接着,您将向 Manufacture Plant 1 服务添加补偿服务。请遵循以下步骤:

  • 选择 Manufacture Plant 1 活动。
  • 单击 Compensation Property 选项卡。
  • 分别将 Partner LinkPort TypeOperation 设置为 RevokeOrder、OrderCompensation 和 revokeOrder。
  • 补偿操作 revokeOrder 的数据已经可以从转发服务的输入消息中获得。所以,您将转发服务的输入变量 ManufacturingLoopManufacturePlant1InputCriteriaVariable 用于补偿服务。

Manufacture Plant 1 服务活动并不参与这个事务。正如下面的图 4 所示,不应该选中属性“Activity Takes Part in Transaction”。在微流中,如果事务失败,则参与事务的活动将回滚。在这种情况下,事务内部并不需要补偿服务活动。只有未参与事务的活动才需要补偿服务,例如,发送电子邮件。其他类型的需要补偿的活动是那些调用不支持分布式事务的远程服务器上的服务的活动。在我们的示例中,工作流通过像 FTP 或 MQ 这样的协议调用远程制造厂服务。这个活动没有参与全局事务。


图 4. 指定补偿服务
图 4. 指定补偿服务

步骤 5:指定流程的补偿域属性

为了触发补偿,补偿域必须是可用的。当启动业务流程时,由业务流程执行的可补偿活动集的范围就设置好了。这个定义的范围称为补偿域。正如下面的图 5 所示,您可以在 Server 设置中的流程属性单上指定补偿域的设置。


图 5. 补偿域设置
图 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 对本文提供的帮助。


参考资料

作者简介

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 与他联系。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=SOA and web services
ArticleID=128746
ArticleTitle=随需应变的业务流程生命周期,第 12 部分: 实现补偿服务
publish-date=08122005
author1-email=liuwei@us.ibm.com
author1-email-cc=Copy email address
author2-email=gsg@us.ibm.com
author2-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。