探秘WebSphere Process Server事务性

Marc Fasbinder, IT 咨询专家, IBM

转自:http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0906_fasbinder/0906_fasbinder.html

简介

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 中的事务性概念,我们将使用一个简单的 “三步” 流程。您可以将本文提供的这个项目的交换文件 ShortRunningProcess_PI.zip 导入到您的工作空间,以便跟随文章进行操作。这个流程是一个带有三个步骤的短期运行流程,每一步都调用一个服务。每个服务都位于它们自身的模块中:

  • 一个 Java™ 组件,它在控制台中显示一条消息。
  • 一个带有 WebSphere MQ 绑定的导入,它向一个队列写一条消息。
  • WebSphere Flat File Adapter,它将一条消息写到一个文本文件中。

这个流程使用服务组件架构(SCA)调用这三个模块。集成解决方案图表如图 1 所示。


图 1. 解决方案图
解决方案图

为了简化,每个服务使用相同的接口 txnDemoInterface。这个流程将运行一个简单的 Java 组件,将一条消息放到一个 MQ 队列中,然后将它写入一个平面文件中。

导入项目交换文件之后,将四个模块全部部署到您的服务器上。

Java 模块

这个 Java 模块包含一个 SCA 输出,以及一个 Java 组件。生成的 Java 被更新,以便将一条消息写入控制台中(如清单 1 所示)。


清单 1. Java 组件

				
public DataObject runService(DataObject input) {
	System.out.println("Running simple Java...");
	return input;
}

MQ 模块

这个 MQ 模块包含一个 SCA 输出,以及一个使用 WebSphere MQ 绑定的 Import。这个 Import 针对一个本地队列管理器和一个本地队列进行配置(如图 2 所示)。


图 2. MQ 导入设置
MQ 导入设置

短期运行流程只能调用同步服务。因此这个 ToMQ 导入使用一个单向接口,这个接口将只生成一条消息。一个双向接口将等待一个响应。由于接口之间存在不匹配,在导出和导入之间要使用一个中介组件。

更新 End-point configuration 选项卡的值以指向您自己的队列管理器。如果您的系统上没有 postcard 队列,您可以创建一个 postcard 队列,或者将目标队列更改为一个已经存在的队列。

文件模块

这个文件模块(如图 3 所示)包含一个 SCA 导出,一个外向的 WebSphere Adapter 导入(使用 WebSphere Adapter for Flat Files),以及一个中介流。这个适配器导入拥有一个与其他工件不同的接口,即它需要一个中介才能被调用。


图 3. 文件模块
文件模块

这个中介映射操作,将输入数据发送到适配器。任何响应或错误消息将被映射到返回消息中的状态字段。图 4 显示了返回映射。


图 4. 中介响应映射
中介响应映射

WebSphere Flat File Adapter 被配置为将输出写入到 C:\FileOutput 目录中的一个文件。运行流程之前,创建一个目录以匹配这个名称,或者更新 FlatFileImport 的配置以指向您的硬盘上的一个现有目录。

流程

这个流程的初始版本是短期运行的。流程属性允许您设置流程运行的方式。如图 5 所示,该流程有一个长期运行标记,用于指定使用哪种流程样式。Process Server 使用 WebSphere Application Server 中的事务管理器作为它的事务的基础。对于短期运行流程,事务的边界就是整个流程。


图 5. 流程属性
流程属性

运行流程

作为一个短期运行流程,预期的行为就是调用全部三个服务并执行事务。对于初始测试,启动服务器,然后部署所有四个模块。

  1. 选择 servers 选项卡,然后右键单击您的服务器。选择 Add and Remove Projects ...,然后单击 Add All >> 以将这四个项目添加到您的服务器。单击 Finish。这些项目将发布。这可能要花一些时间,取决于您的系统的速度。
  2. 右键单击该服务器并选择 Launch - Business Process Choreographer Explorer。使用用户 ID admin 和密码 admin 登录。如果提示一个安全异常,选择 Yes 继续。
  3. 单击 Process Templates。如果这些模块全部部署,您将在列表中看见 TxnProcess。注意,长期运行标记被设置为 no。
  4. 选择 TxnProcess 复选框并单击 Start Instance(如图 6 所示)。这将显示一个表格,用于向流程进行输入。

    图 6. 启动这个流程
    启动这个流程

  5. 输入您的名字,一个数量,以及状态 new。单击 Submit 以启动流程。
  6. 检查控制台。显示的消息是 “Running simple Java”。这显示这个 Java 组件被调用了。
  7. 使用一个工具,比如来自 WebSphere MQ Support Pac IH03 的 RFHUtil,来寻找在名为 postcard 的队列上的消息。得到的数据类似于图 7。

    图 7. 在 RFHUtil 中显示的消息
    在 RFHUtil 中显示的消息

  8. 检查目录 C:\FileOutput,您将发现两个文件。DemoData.seq 是用于索引文件名的序列文件。DemoData.1.txt 文件包含数据。编辑这个文件。您将看到类似于清单 2 的输出。

    清单 2. 文件输出
    						
    <?xml version="1.0" encoding="UTF-8"?>
    Marc123New

    流程输出消息显示在 Business Process Choreographer Explorer 中。来自 Flat File Adapter 的返回代码显示在状态中(如图 8 所示)。如果消息成功写出,文件消息将设置为创建的文件的名称。

    图 8. 流程输出消息
    流程输出消息

这个流程已经成功运行。您可以删除这些文件并从队列删除这条消息,以准备下一次测试。

运行带有一个故障的流程

现在这个流程正在运行,下一步就是测试事务如何工作。一个简单的方法就是故意使 Flat File Adapter 产生一个问题,从而导致一个故障。

  1. 使用 Windows® Explorer 删除 C:\FileOutput 目录。
  2. 按照上述 1 至 5 步启动一个新的流程实例。
  3. 这个流程调用 Java 组件来显示这条消息。
  4. 这个流程将一条消息写入 WebSphere MQ 队列。
  5. 这个流程调用 Flat File Adapter,它会导致一个故障。您将看到几条消息出现在控制台中。
  6. 检查 postcard 队列,队列中没有消息。

为何会发生这种情况?当短期运行流程启动时,一个事务就打开了。前两个服务调用成功,但是当第三个服务返回故障时,这个事务就被回滚。因为您不能够撤销在控制台上写入的信息,所以对第一个服务不进行任何操作。对于 MQ 服务,当这个事务回滚时,这条消息就不会写入队列中。

这个测试显示,当短期运行流程出现故障时,事务就会被回滚。单击 Servers 选项卡。右键单击您的服务器并选择 Add and Remove Projects。选择 ProcessModuleApp 并单击 Remove Finish。这个流程的短期运行版本就从服务器上删除了。

长期运行流程

在下一个测试中,这个流程需要从短期运行更改为长期运行。您可以进行一些更新,或者导入 LongRunningProcess_PI.zip 文件中提供的项目交换文件。

  1. 展开 ProcessModule - Integration Logic - Processes 并双击 TxnProcess。流程编辑器打开。
  2. 单击 Properties 选项卡。单击流程编辑器中的空白区域以选择流程属性。
  3. 选择复选框 Process is Long Running
  4. 保存这个流程。您将在 Problems 视图中看到两个错误。流程接口的 Join Transaction 修饰符需要设置为 False。您可以在集成编辑器中执行这个步骤。
  5. 流程接口的首选交互样式应该设置为 Async。遗憾的是,您不能在集成编辑器中更改这个设置。最好的办法是从集成图表中删除这个流程组件,拖动并放下更新后的流程,并将其重新连接到三个导入上。
  6. 在 ProcessModule 中双击 Assembly Diagram,打开集成编辑器。
  7. 右键单击 TxnProcess 组件并选择 Delete
  8. TxnProcess 从 ProcessModule 拖动出来并放置到画布上。
  9. 将来自流程的三个引用都连接到相应的导入。如果您将鼠标悬停在一个引用的上方,将显示一个带有信息的弹出窗口(如图 9 所示)。

    图 9. 连接流程
    连接流程

  10. 保存更新后的集成图表。
  11. 工作空间重构之后,右键单击您的服务器并选择 Add and Remove Projects,将 ProccessModuleApp 添加到服务器并单击 Finish
  12. 更新后的流程就部署到您的服务器上了。

运行流程

现在流程已经部署,您可以试着运行它。第一次迭代将创建 C:\FileOutput 目录,以便 Flat File Adapter 能够成功写文件。

  1. 启动 Business Process Choreographer Explorer,或者重新登陆(如果它还在运行)。
  2. 单击 Process Templates,TxnProcess 现在显示 Long-Running 标记被设置为 yes
  3. 选择 TxnProcess 复选框并单击 Start Instance
  4. 输入一个名称、数量、状态并单击 Submit
  5. 消息 Running Simple Java... 出现在控制台中。
  6. 一条名为 postcard 的消息出现在 WebSphere MQ 队列中。
  7. 一个文件创建在 C:\FileOutput 目录中。

长期运行流程与短期运行流程的工作方式类似。

运行带有一个故障的流程

要测试一个长期运行的流程的事务行为,执行与前面相同的步骤以删除 c:\FileOutput 目录,导致 Flat File Adapter 发生一个故障。

  1. 删除目录后,启动另一个流程实例。
  2. 这条消息出现在控制台中,消息之后是错误消息。
  3. 检查名为 postcard 的 WebSphere MQ 队列。一条消息出现在队列中,即使出现了一个故障。

发生了什么事?一个长期运行流程的每一步都是该流程自身的或流程中的一个事务。这条消息写入队列后,事务被执行。文件输出步骤发生在它自己的事务中。事务失败时,前面的步骤已经提交了。

  1. 在 Business Process Choreographer Explorer 中,单击 Process Instances 下面的 Started By Me
  2. 您将看到您的流程状态为 failed(如图 10 所示)。

    图 10. 失败的流程实例
    失败的流程实例

  3. 重新创建目录 C:\FileOutput
  4. 单击您的流程实例的复选框,然后单击 Activities(如图 11 所示)。

    图 11. 选择流程实例行为
    选择流程实例行为

  5. 您将看见流程的所有行为,WriteFile 处于失败状态。
  6. 选择 WriteFile 复选框并单击 Restart(如图 12 所示)。 流程重新启动并从头至尾运行。

    图 12. 重新启动失败的行为
    重新启动失败的行为

  7. 删除队列中的所有消息,为下一部分进行清理。

为什么流程必须重新启动呢?在流程中没有错误句柄,因此故障使流程进入一种称为 Failed 的状态(如图 11 所示)。也可以修改这个流程以便重新执行失败的步骤,而无需从头重新启动。解决这个问题的关键是一个叫做 Continue on Error 的属性,它使流程中的每个行为默认设置为 Yes(如图 13 所示)。


图 13. Continue on error
Continue on error

  1. 编辑 TxnProcess,单击 Properties 选项卡并单击任务 Write File
  2. Details 选项卡上,将 Continue On Error 更改为 No
  3. 保存流程并将 ProcessModuleApp 发布到服务器。
  4. 确认目录 c:\FileOutput 不存在。
  5. 从 Business Process Choreographer Explorer 转到 Process Templates 视图并启动流程的一个实例。
  6. 流程运行,直到 Write File 步骤发生故障。
  7. 单击 Process Instances - Started By Me。注意,这个流程处于 Running 状态,而不是 Failed 状态。
  8. 选择您的流程实例的复选框,然后单击 Activities。将显示您的流程的行为列表。这次,WriteFile 步骤处于 Stopped 状态而不是 Failed,这允许您执行那些对失败的行为无效的操作。
  9. 再次创建 c:\FileOutput 目录,以便该行为可以成功执行。
  10. 在 Business Process Choreographer Explorer 中,选择 WriteFile 复选框并单击 Restart(如图 14 所示)。

    图 14. 重新启动 WriteFile
    重新启动 WriteFile

  11. Activity Restart 屏幕出现,显示流程数据。单击 Restart 按钮。这次,WriteFile 行为成功执行。确认文件已经创建。
  12. 从队列删除消息并删除 c:\FileOutput 目录,准备进行下一部分。

如果您不打算处理您的流程中的故障,您可以使用 Continue On Error 属性允许授权的流程管理员修复失败的流程,而不是必须从头重新启动。您还可以执行一个 Force Complete,该操作允许您手动输入输出数据,完成任务,然后恢复流程。

高级事务设置

在长期运行流程中,默认行为是使每个行为作为自身的事务运行。您也可以为长期运行的业务流程中的步骤指定事务行为。对于每一个流程行为,您可以选择一个属性来设置事务(如图 15 所示)。


图 15. 事务行为
事务行为

使用这些设置,您可以使一个长期运行流程中的多个行为在一个事务中运行。例如,如果您有一个包含两个服务调用的人员任务,您可以为这两个服务使用一个事务。

除了这个设置,SCA 修饰符也很重要。一个 SCA 修饰符将覆盖流程设置。如果您正在调用的一个组件无法参与一个全局事务,它将在该组件运行前强迫执行一个提交。要探秘这种行为,编辑 ProcessModule 的集成图表。

  1. 编辑 TxnProcess。对于 Call MQWrite File,单击 Server 选项卡并将 Transactional Behavior. 设置为 Participates。现在,这三个步骤都标记为在一个事务中运行。保存流程。
  2. 展开 ProcessModule 并双击 Assembly Diagram。集成图表编辑器打开。
  3. 右键单击 TxnProcess 并选择 Show Transaction from Here。您将看见一个类似于图 16 的界面。

    图 16. 事务边界
    事务边界

    这里发生了什么事?这个流程中的两个行为都设置为参与一个事务,但是只有 SendToMQ 显示在这个事务中。问题就出在 SCA 修饰符。
  4. 展开 FileModule 并双击 Assembly Diagram
  5. Properties 选项卡中,单击 Qualifiers。这个模块的 SCA 修饰符被显示(如图 17 所示)。

    图 17. FileModule 的 SCA 修饰符
    FileModule 的 SCA 修饰符

FlatFileImport 的 Join transaction 修饰符被设置为 False,这覆盖了流程中的设置,这就是图 16 中显示的事务只包含 SendToMQ 的原因。要将这个修饰符设置为 True,您必须通过一个同步接口来调用这个服务。

补偿

如果您想要在一个事务中使用一个服务,但这个服务是非事务性服务,这时会发生什么情况呢?在 txnProcess 中,正在被调用的服务是同步的,这表示它不能加入这个事务。解决方法是一个称为补偿(compensation) 的概念。

补偿使一个长期运行的业务流程具有像短期运行流程一样的服务特性。那些已经被调用和提交的服务通过使用补偿句柄来 “撤销”。

  • 如果一个服务添加一条记录,补偿则删除这条记录。
  • 如果一个服务更新一条记录,补偿则恢复原始值。
  • 如果一个服务删除一条记录,补偿则恢复这条记录。

并不是流程中的每一个步骤都需要撤销。您不能 “撤销” 文档打印操作。某人不能 “撤销之前” 批准了的请求。通常,补偿将撤销部分自动服务,这些自动服务被流程调用。补偿也可以用于短期运行流程中已调用的服务不能加入一个事务的情况。

要阅读关于补偿的一篇详细文章,参阅 在运行于 Business Process Choreographer 的业务流程中使用补偿

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14789789/viewspace-614787/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14789789/viewspace-614787/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值