本文共 7221 字,大约阅读时间需要 24 分钟。
, IT 咨询专家, IBM
转自:
IBM® WebSphere Process Server(以下称为 Process Server)支持不同类别的业务流程。这些流程使用 WS-BPEL 定义,WS-BPEL 是一种短期运行的 “微流程” 样式,它完全在内存中运行。在短期运行流程中,调用的服务被绑定到一起,就像一个工作单元一样;故障发生时,事务性服务能够回滚。短期运行流程是无状态的,通常拥有次秒级性能。短期运行流程中的所有任务都是同步的,没有人员任务。如果您有数千个流程实例正在运行,在它们提交其工作之前它们需要等待数天或数周时间才能完成,这样您就会遇到死锁问题。
为了解决这个问题,需要使用另一种长期运行的业务流程类别。这些流程花费几分钟、几小时、几天甚至几个月的时间才能完成。它们的状态在一个数据库中进行维护,这意味着即使服务器停止,流程将从它中断的地方恢复运行。包含人员任务的流程必须始终是长期运行的。默认情况下,长期运行流程中的每一步都是该流程自身的或流程中的一个事务。但是,有一些参数可以控制其行为,本文将讨论流程的行为。
本文使用 WebSphere Integration Developer 版本 6.2.0.1 和 WebSphere Process Server 版本 6.2.0.1。本文假定读者对这两个产品的知识达到中级水平。
为了探索 Process Server 中的事务性概念,我们将使用一个简单的 “三步” 流程。您可以将本文提供的这个项目的交换文件 导入到您的工作空间,以便跟随文章进行操作。这个流程是一个带有三个步骤的短期运行流程,每一步都调用一个服务。每个服务都位于它们自身的模块中:
这个流程使用服务组件架构(SCA)调用这三个模块。集成解决方案图表如图 1 所示。
为了简化,每个服务使用相同的接口 txnDemoInterface。这个流程将运行一个简单的 Java 组件,将一条消息放到一个 MQ 队列中,然后将它写入一个平面文件中。
导入项目交换文件之后,将四个模块全部部署到您的服务器上。
这个 Java 模块包含一个 SCA 输出,以及一个 Java 组件。生成的 Java 被更新,以便将一条消息写入控制台中(如清单 1 所示)。
public DataObject runService(DataObject input) { System.out.println("Running simple Java..."); return input;} |
这个 MQ 模块包含一个 SCA 输出,以及一个使用 WebSphere MQ 绑定的 Import。这个 Import 针对一个本地队列管理器和一个本地队列进行配置(如图 2 所示)。
短期运行流程只能调用同步服务。因此这个 ToMQ 导入使用一个单向接口,这个接口将只生成一条消息。一个双向接口将等待一个响应。由于接口之间存在不匹配,在导出和导入之间要使用一个中介组件。
更新 End-point configuration 选项卡的值以指向您自己的队列管理器。如果您的系统上没有 postcard 队列,您可以创建一个 postcard 队列,或者将目标队列更改为一个已经存在的队列。
这个文件模块(如图 3 所示)包含一个 SCA 导出,一个外向的 WebSphere Adapter 导入(使用 WebSphere Adapter for Flat Files),以及一个中介流。这个适配器导入拥有一个与其他工件不同的接口,即它需要一个中介才能被调用。
这个中介映射操作,将输入数据发送到适配器。任何响应或错误消息将被映射到返回消息中的状态字段。图 4 显示了返回映射。
WebSphere Flat File Adapter 被配置为将输出写入到 C:\FileOutput 目录中的一个文件。运行流程之前,创建一个目录以匹配这个名称,或者更新 FlatFileImport 的配置以指向您的硬盘上的一个现有目录。
这个流程的初始版本是短期运行的。流程属性允许您设置流程运行的方式。如图 5 所示,该流程有一个长期运行标记,用于指定使用哪种流程样式。Process Server 使用 WebSphere Application Server 中的事务管理器作为它的事务的基础。对于短期运行流程,事务的边界就是整个流程。
作为一个短期运行流程,预期的行为就是调用全部三个服务并执行事务。对于初始测试,启动服务器,然后部署所有四个模块。
Marc123New |
这个流程已经成功运行。您可以删除这些文件并从队列删除这条消息,以准备下一次测试。
现在这个流程正在运行,下一步就是测试事务如何工作。一个简单的方法就是故意使 Flat File Adapter 产生一个问题,从而导致一个故障。
为何会发生这种情况?当短期运行流程启动时,一个事务就打开了。前两个服务调用成功,但是当第三个服务返回故障时,这个事务就被回滚。因为您不能够撤销在控制台上写入的信息,所以对第一个服务不进行任何操作。对于 MQ 服务,当这个事务回滚时,这条消息就不会写入队列中。
这个测试显示,当短期运行流程出现故障时,事务就会被回滚。单击 Servers 选项卡。右键单击您的服务器并选择 Add and Remove Projects。选择 ProcessModuleApp 并单击 Remove Finish。这个流程的短期运行版本就从服务器上删除了。
在下一个测试中,这个流程需要从短期运行更改为长期运行。您可以进行一些更新,或者导入 文件中提供的项目交换文件。
现在流程已经部署,您可以试着运行它。第一次迭代将创建 C:\FileOutput 目录,以便 Flat File Adapter 能够成功写文件。
长期运行流程与短期运行流程的工作方式类似。
要测试一个长期运行的流程的事务行为,执行与前面相同的步骤以删除 c:\FileOutput 目录,导致 Flat File Adapter 发生一个故障。
发生了什么事?一个长期运行流程的每一步都是该流程自身的或流程中的一个事务。这条消息写入队列后,事务被执行。文件输出步骤发生在它自己的事务中。事务失败时,前面的步骤已经提交了。
为什么流程必须重新启动呢?在流程中没有错误句柄,因此故障使流程进入一种称为 Failed 的状态(如图 11 所示)。也可以修改这个流程以便重新执行失败的步骤,而无需从头重新启动。解决这个问题的关键是一个叫做 Continue on Error 的属性,它使流程中的每个行为默认设置为 Yes(如图 13 所示)。
如果您不打算处理您的流程中的故障,您可以使用 Continue On Error 属性允许授权的流程管理员修复失败的流程,而不是必须从头重新启动。您还可以执行一个 Force Complete,该操作允许您手动输入输出数据,完成任务,然后恢复流程。
在长期运行流程中,默认行为是使每个行为作为自身的事务运行。您也可以为长期运行的业务流程中的步骤指定事务行为。对于每一个流程行为,您可以选择一个属性来设置事务(如图 15 所示)。
使用这些设置,您可以使一个长期运行流程中的多个行为在一个事务中运行。例如,如果您有一个包含两个服务调用的人员任务,您可以为这两个服务使用一个事务。
除了这个设置,SCA 修饰符也很重要。一个 SCA 修饰符将覆盖流程设置。如果您正在调用的一个组件无法参与一个全局事务,它将在该组件运行前强迫执行一个提交。要探秘这种行为,编辑 ProcessModule 的集成图表。
FlatFileImport 的 Join transaction 修饰符被设置为 False,这覆盖了流程中的设置,这就是图 16 中显示的事务只包含 SendToMQ 的原因。要将这个修饰符设置为 True,您必须通过一个同步接口来调用这个服务。
如果您想要在一个事务中使用一个服务,但这个服务是非事务性服务,这时会发生什么情况呢?在 txnProcess 中,正在被调用的服务是同步的,这表示它不能加入这个事务。解决方法是一个称为补偿(compensation) 的概念。
补偿使一个长期运行的业务流程具有像短期运行流程一样的服务特性。那些已经被调用和提交的服务通过使用补偿句柄来 “撤销”。
并不是流程中的每一个步骤都需要撤销。您不能 “撤销” 文档打印操作。某人不能 “撤销之前” 批准了的请求。通常,补偿将撤销部分自动服务,这些自动服务被流程调用。补偿也可以用于短期运行流程中已调用的服务不能加入一个事务的情况。
要阅读关于补偿的一篇详细文章,参阅 。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14789789/viewspace-614787/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14789789/viewspace-614787/