使用 IBM BPM Advanced Integration Service 开发分布式 WS-AT 事务,第 5 部分: 执行案例

本文章系列介绍了如何利用 IBM Business Process Manager V8.0.1 Advanced 中的 Advanced Integration Services (AIS) 功能实现一个分布式 WS-AT 场景,该场景涉及两个不同的数据库(Microsoft® SQL Server 和 IBM® DB2®),它们安装在两个不同的机器上,可通过两个 Web 服务对它们进行访问:一个使用 .NET 实现,另一个使用 JEE 实现。该实现演示了一些自动回滚功能,这些功能由 AIS 中基于 SCA 的管理与 WS-AT 协议协同提供。在本系列的最后一篇文章中,您将学习如何执行和测试不同的事务场景,这些场景包含本系列前几部分中设计和开发的组件。

Carlo Randone, 认证 IT 架构师 , IBM

Carlo Randone 是位于意大利的 IBM 全球企业咨询服务部的一名 IBM 认证 IT 架构师和 Open Group Master 认证 IT 架构师。Carlo 拥有在异构环境和操作系统上使用不同开发平台和中间件的丰富知识。作为一位经过认证的培训师和软件开发人员,他曾为一家 Microsoft® 认证的合作伙伴工作多年。

自 2000 年加入 IBM 以来,Carlo 的主要工作兴趣涉及 SOA 和 BPM、与它们相关的软件工程方法和支持平台,以及企业架构规划和设计。他喜欢收集与 IT 的历史发展相关的文档和硬件零部件,而且为了支持这一爱好,他成为了 Charles Babbage Institute 的一员。



Marco Antonioni, 认证 IT 架构师, IBM

Marco Antonioni 是位于意大利的 IBM 全球企业咨询服务部的一位经过认证的 IT 架构师和 Open Group Master 认证的 IT 架构师。Marco 拥有各种 WebSphere 平台(WebSphere Application Server、WebSphere Process Server、IBM Business Process Manager、IBM Operational Decision Manager、IBM Business Monitor、WebSphere Service Registry and Repository 和 WebSphere Message Broker)方面的深厚知识。自 2000 年加入 IBM 以来,他担任的主要职位是 IBM WebSphere 软件服务部的 BPM 解决方案架构师。



2013 年 10 月 15 日

执行案例

本系列的最后一部分提供了一些有趣的执行案例。在真实的环境中,这些类型的场景可能成为为事务解决方案开发实用的测试案例的基础。

案例 1:一切正常

在此场景中,资金从 Bank1(SQL Server 上)的一个帐户转移到 Bank2(DB2 上)的另一个帐户,这些帐户已存在并且没有出现基于触发器的异常(Bank1 上拥有请求的转账金额)。此场景中的结果是产生一个事务提交。我们将此案例称为 “一切正常” 案例。

以下是此案例的一些示例输入值,如 中所示:

  • Bank1(用于扣费)的数据源 (-)Data Source=localhost; Uid=sa; Initial Catalog=Bank1; Pwd=mypwd
  • 用于扣费的 Account1 表(在 Bank1 上)dbo.Accounts
  • 用于扣费的 Account1(在 Bank1 上)Karl
  • Bank2(用于贷入)的数据源 (+)jdbc/bank2db2
  • 用于贷入的 Account2 表(在 Bank2 上)ADMINISTRATOR.Accounts
  • 用于贷入的 Account2(在 Bank2 上)Donald
  • 转账金额:10
“一切正常” 案例的输入
“一切正常” 案例的输入

显示了错误 Coach 中相关的 “一切正常” 消息。

来自 “一切正常” 案例的输出
来自 “一切正常” 案例的输出

可以看到,最终的输出消息是来自 Credit Web 服务的(积极)输出消息和来自 Charge Web 服务的(积极)输出消息的串联结果。

案例 2 – 资金不足

在此场景中,资金从 Bank1(SQL Server 上)的一个帐户转移到 Bank2(DB2 上)的另一个帐户,这些帐户已存在,但由于扣费帐户(Bank1 上)上资金不足而出现了一个基于数据库触发器的异常。此场景的结果是产生一次事务回滚。

以下是此案例的一些示例输入值,如 中所示:

  • Bank1(用于扣费)的数据源 (-)Data Source=localhost; Uid=sa; Initial Catalog=Bank1; Pwd=mypwd Table for Account1 for charge (on Bank1): dbo.Accounts
  • 用于扣费的 Account1(在 Bank1 上)Karl
  • Bank2(用于贷入)的数据源 (+)jdbc/bank2db2
  • 用于贷入的 Account2 表(在 Bank2 上)ADMINISTRATOR.Accounts
  • 用于贷入的 Account2(在 Bank2 上)Donald
  • 转账金额200
用于创建资金不足案例的参数值
用于创建资金不足案例的参数值

显示了错误 Coach 中的输出消息。事务被回滚,Karl 和 Donald 帐户中金额没有发生变化。

资金不足错误
资金不足错误

在这种情况下,运行时故障(由 Charge Web 服务拦截)来自 SQL Server 数据库 (Bank1) 上的数据库触发器。

因为实现的基于 SCA 的仲裁首先执行 Credit 操作,所以此案例明确显示了事务行为。因此,举例而言,在我们尝试将 200 个价值单位的金额从 Bank1 (SQL Server) 上的 Karl 帐户转移到 Bank2(DB2 上)的 Donald 帐户时,假设 Karl 默认情况下只有 100 个可用的价值单位,并提供了上面列出的输入,然后将执行以下操作:

  • 启动 TxMediation 流(AIS 实现),创建一个事务上下文。
  • (在 DB2 上的 Bank2 上的 Donald 帐户上)调用第一个操作(在目标帐户上调用 Credit Web 服务)。该操作正常完成。一段时间后,对 Bank2(DB2 上)上未提交记录的读取操作将会显示 Donald 帐户和贷入的金额。
  • 调用该流程中的第二个操作(在 SQL Server 上的 Bank1 上的来源帐户 Karl 上调用 Charge(借方)Web 服务。SQL Server Accounts 表上的触发器抛出一个错误,因为 Karl 帐户中没有所请求的金额。此错误由 Charge Web 服务拦截(捕获),该服务将该错误重新抛出给中介流(AIS 中的中介流)。
  • 该异常在中介流中管理,然后会退出中介流并抛出一个故障。此时,事务中涉及的资源(DB2 目标数据库和 SQL Server 来源数据库)收到一个回滚命令。如果尝试读取该数据库上单击路,就会看到所涉及的两个帐户上的值都没有发生变化。
  • 该错误在 BPMN 流中由错误事件管理,该事件连接到具体的 Coach,以便向用户显示错误细节。 显示了 Coach 中的错误消息,其中包含 “insufficient money” 信息。

案例 3:无效的帐户

在此场景中,资金从 Bank1(SQL Server 上)的一个现有帐户转移到 Bank2(DB2 上)一个不存在的帐户 (Donaldx),这会导致 Credit Web 服务抛出一个异常。此场景的结果是产生一次事务回滚。

以下是此案例的一些示例输入值,如 中所示:

  • Bank1(用于扣费)的数据源 (-)Data Source=localhost; Uid=sa; Initial Catalog=Bank1; Pwd=mypwd
  • 用于扣费的 Account1 表(在 Bank1 上)dbo.Accounts
  • 用于扣费的 Account1(在 Bank1 上)Karl
  • Bank2(用于贷入)的数据源 (+)jdbc/bank2db2
  • 用于贷入的 Account2 表(在 Bank2 上)ADMINISTRATOR.Accounts
  • 用于贷入的 Account2(在 Bank2 上)Donaldx
  • 转账金额10
用于创建无效帐户案例的参数值
用于创建无效帐户案例的参数值

显示了错误 Coach 中的相关消息。Karl 帐户中的金额没有发生变化。

Bank2(用于贷入)上的无效帐户错误
Bank2(用于贷入)上的无效帐户错误

案例 4:第二个无效帐户

资金从 Bank1(SQL Server 上)一个不存在的帐户 (Karlx) 转移到 Bank2(DB2 上)的一个现有帐户,这会导致 Charge Web 服务抛出一个异常。此场景的结果是产生一次事务回滚。

以下是此案例的一些示例输入值,如 中所示:

  • Bank1(用于扣费)的数据源 (-)Data Source=localhost; Uid=sa; Initial Catalog=Bank1; Pwd=mypwd Table for Account1 for charge (on Bank1): dbo.Accounts
  • 用于扣费的 Account1(在 Bank1 上)Karlx
  • Bank2(用于贷入)的数据源 (+)jdbc/bank2db2
  • 用于贷入的 Account2 表(在 Bank2 上)ADMINISTRATOR.Accounts
  • 用于贷入的 Account2(在 Bank2 上)Donald
  • 转账金额10
用于创建第二个无效帐户案例的参数值
用于创建另一个无效帐户案例的参数值

显示了此案例的错误 Coach 中的相关消息。Donald 帐户中的金额没有发生变化。

Bank1(用于扣费)上的无效帐户错误
Bank1(用于扣费)上的无效帐户错误

结束语

本系列文章介绍了 IBM Business Process Manager Advanced 如何利用 Advanced Integration Services 实现来管理两个不同数据库引擎(Microsoft SQL Server 和 IBM DB2)之间的一个 ACID 分布式事务,使用了在两种技术平台(.NET WCF 和 Java JAX-WS)上实现的两个事务 Web 服务。要实现这种管理,您可以配置事务中涉及的组件接口(在本示例中为 Charge 和 Credit 服务,以及基于 SCA 的 ESB 中介),以及利用对 IBM WebSphere Application Server 和 IBM BPM Advanced 的事务功能的支持。

在与本系列所描述的场景类似的场景中,一个团队(举例而言,精通 Windows 和 .NET)可开发基于 Windows 的 Web 服务来访问 SQL Server 数据库,另一个不同的团队(不一定在同一时间)可开发类似的 Web 服务来访问 DB2 数据库,但使用了一种像 JAX-WS 和 WebSphere Application Server 这样的 JEE 方法。这两个团队可在不同的组织中工作,并使用完全不同的技术平台(正如我们在本系列中展示的那样)。

从技术集成开发人员的角度讲,选择在 IBM Business Process Manager 中利用 SCA 编程模型的强大功能,以及对 WS-AT 事务协议的全面支持,不仅有机会重用优秀技能,还有机会使用 IBM Integration Designer 设计和开发的强大而又可靠的技术 “基础服务”,支持面向业务的服务的总体设计和开发。


致谢

感谢同事 Giuseppe Bottura 和 Simone Chiucchi 审阅本文,感谢同事 Stefano Angrisano、Matteo Franciolli 和 Daniele Rossi 对本文所做的贡献。还要感谢 Andrew J. Howes、Billy Lo、Frank I. Toth、Dave Screen、Callum Jackson、Konstantin Luttenberger 和 Oliver Rebmann 提供富有启发性的、引人深思的 developerWorks 文章。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


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


忘记密码?
更改您的密码

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

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

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

选择您的昵称



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

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

标有星(*)号的字段是必填字段。

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

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

 


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


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=959753
ArticleTitle=使用 IBM BPM Advanced Integration Service 开发分布式 WS-AT 事务,第 5 部分: 执行案例
publish-date=10152013