在第 1 部分 中,我们了解了 IBM® Business Process Manager (BPM) Advanced V8.5 中的 Process Designer、Integration Designer 和 Process Center 之间的关系。还了解了这种技术关系如何成为一个项目上的协作关系的基础。我们学习了如何设计和建模一个业务流程,包括在 Process Designer 中创建一个服务并在 Integration Designer 中实现它。还在 Integration Designer 和 Inspector 中执行了单元测试,学习了如何构建用户界面和在一次开发迭代结束时创建快照。
回页首
在本文中,我们将重点介绍 IBM BPM 如何促进业务组织的自然协作。这一次,我们的技术专家 Susan 会将 Integration Designer 中的现有应用程序推送到 Process Designer 中;也就是说,您将看到如何让 Integration Designer 中的应用程序可供在 Process Designer 中工作的人看到。还将分析如何访问一个后端系统,企业将大量数据存储在这个系统中。不幸的是,该数据可能具有不同的格式,所以您还将学习如何使用映射将数据转换为不同环境中所需的格式。您将在用户界面上执行操作,然后在 Integration Designer 和 Process Designer 中执行单元测试。
本文提供了文中讨论的流程应用程序。
尽管本文介绍了如何开始采用某种协作式方法,但您还应该阅读本文的参考资料部分中引用的文章。这些文章介绍了使用 Process Designer 和 Integration Designer 开发业务流程时应当遵循的最佳实践。
回页首
大多数业务流程并不是从头创建的。相反,他们重用了可添加到业务流程中的应用程序。Susan 已在 Integration Designer 中提供了一个应用程序来获取客户编号(customerID 变量),返回该客户的能源账单的增幅(energyIncrease 变量)。此应用程序被放入到 John 的 Advanced Integration Service(Get Energy Bill Increase)中。Susan 需要通过 John 使用的 Process Center 来公开她的应用程序,以便 John 可以使用 Susan 的应用程序来实现他的 Advanced Integration Service。
回页首
Susan 首先在 Integration Designer 中刷新并发布 Customer Retainer 模块,以确认 John 是从来自 Process Center 的最新更新上开始自己的工作。请记住,Integration Designer 不会在您将工作保存到 Process Designer 中时自动更新。因此,您必须定期更新 Integration Designer。
然后,Susan 将会创建一个库,让自己能够使用 Customer Retainer 模块在 Integration Designer 和 Process Designer 之间共享各项内容。她将这个库命名为 “EnergyIncreaseService_Library”。如果您接着第一篇文章的介绍继续自行构建此应用程序,那么可以右键单击 Customer Retainer > New > Project > Library 来创建这个库。在后续页面中,您需要检查该库是否与 “Customer Retainer” 有关联。
然后,Susan 将会建立该库的镜像。这是什么意思?在建立一个库的镜像时,如果您在 Integration Designer 中的库中放入了某些东西,那么它们会显示在 Process Designer 中的相同库中。但是,在 Process Designer 中,一个库被称为一个工具包。为了建立库的镜像,Susan 右键单击 EnergyIncreaseService_Library 。她选择了 Properties > Business Integration > Library Mirroring ,如图 1 所示。如果自行构建此应用程序,那么这将是您可以探索的另一个选择。
图 1. 建立一个库的镜像
Susan 拥有一些 Java™ 应用程序代码,但她需要将该代码放在 Integration Designer 中的一个模块中,以便她的具体应用程序能够成为一个更大的 Customer Retainer 业务流程的一部分。她创建该模块,然后为应用程序添加一个接口,最后添加她的应用程序。
Susan 为她的现有应用程序创建了一个模块并将其命名为 “EnergyIncreaseService”。像任何新模块一样,Susan 从菜单开始操作,使用 File > New > Module 。她添加该模块的名称 EnergyIncreaseService。在 Required Libraries 页面上,她选择了 EnergyIncreaseService_Library 。在选择一个流程应用程序或工具包的页面上,Susan 选择 Customer Retainer。她完成创建后,Customer Retainer 下将出现 EnergyIncreaseService 和 EnergyIncreaseService_Library,如图 2 所示。
图 2. 为现有的流程应用程序创建模块
Susan 拥有自己的负责获取 customerID 的 Java 应用程序,并返回客户的能源账单增幅。为了将此应用程序添加到此模块中,她首先打开 EnergyIncreaseService,将一个 Java 组件从面板拖到画布上。她将该 Java 组件重命名为 “GetEnergyIncreaseService” 并保存自己的工作。
然后,Susan 创建了一个接口来映射到她拥有的应用程序代码。她选择了 GetEnergyIncreaseService 并单击 Add Interface ,如图 3 所示。
图 3. 添加一个接口
在后续页面中,她选择了一个新接口并将其命名为 “GetEnergyIncreaseService”,然后,她选择 EnergyIncreaseService_Library 作为它的库。将接口和业务对象放在一个库中,以便可以共享它们,这是一种很好的编程实践。然后,她创建了一个 invoke 操作,使用 customerID(字符串)作为输入和 energyIncrease(整数)作为输出,如图 4 所示。如果自行构建此接口,那么可以尝试这么做或参考完成的应用程序。
图 4. 创建接口的 invoke 操作
此刻,Susan 的应用程序已经可用,但对于本文,我们已经提供了一个应用程序。可以在本文的下载部分找到这个简单的 Java 方法,该方法名为EnergyIncreaseServiceMethod.txt。如果在构建自己的应用程序时要添加此方法,可以首先右键单击 GetEnergyIncreaseService ,然后单击 Generate Implementation 。系统会要求您将它放入一个包中。单击 New Package 并将它命名为 “energyincreases”。将未实现的 invoke 方法替换为 EnergyIncreaseServiceMethod。保存您的 Java 代码。我们应该没有犯什么错误。
浏览 invoke 方法。出于简便起见,我们只创建了两个客户作为输入:Marge 和 Homer。如果 Marge 的编号 1TOR1234 被传递给此方法,它应返回能量增幅 10(表示 10%)。如果 Homer 的编号 1TOR5678 被传递给此方法,它应返回能量增幅 20(表示 20%),如清单 1 所示。
清单 1. 返回客户的能源增幅的 invoke 方法
public Integer invoke (String customerID ) { // Initialize local variables String MargeNumber = "1TOR1234"; String HomerNumber = "1TOR5678"; int energyIncrease = 00; // Determine what customer number was entered and return // energy increase. Return 00 if unknown customer number if (customerID.equals(MargeNumber)) { energyIncrease = 10; } else if (customerID.equals(HomerNumber)) { energyIncrease = 20; } return new Integer(energyIncrease); }
如果格式很难看,那么可以右键单击代码并选择 Source > Format 。然后保存您的工作并关闭 Java 编辑器。同样地,再次保存 Assembly 编辑器中的工作。
Integration Designer 中的一个导出会向其他应用程序公开您的应用程序。Susan 为她的 Java 应用程序创建一个导出,以便 John 可以在 Process Designer 中找到它。Susan 右键单击 GetEnergyIncreaseService 并选择 Generate Export > SCA Binding 。有多个绑定,比如 EnterpriseJavaBeans (EJB)、HTTP、Web Service 和 Messaging 绑定,它们会进一步拆分为 JMS、MQ 或一般性的 JMS 绑定,如图 5 所示。SCA 是一种适合许多应用程序的基本绑定。
图 5. 使用 SCA 绑定创建一个导出
在 Susan 创建她的方法时,获取了一个客户编号作为输入,并返回该客户编号的能源使用增幅。她通过检查来确认此方法现在可供 Process Designer 看到;换句话说,通过检查来确认 John 可在 Process Designer 中找到它。在 GetEnergyIncreaseServiceExport 下的 Assembly 编辑器中,Susan 查看 Properties 视图并选择 Binding 选项卡。她通过检查来确认 Make operations visible to IBM Process Designer 已被选中,如图 6 所示。
图 6. 让操作可供 Process Designer 看到
如何添加这个复选标记?Susan 将 GetEnergyIncreaseService 的接口放入 EnergyIncreaseService_Library 中后,她将该接口放在一个与 Process Designer 共享(或建立了镜像)的库中。因此,IBM BPM 让此操作变得可见。正常情况下,Integration Designer 中的操作无法被 Process Designer 看到。
请注意术语也发生了更改。Java 中的一个方法对应于 XML 中的一个操作。
与第1 部分 中一样,在告诉 John 他可以在 Process Designer 中执行系统测试之前,Susan 还在 Integration Designer 中对她的工作执行了单元测试。
Susan 使用 Integration Test Client 和两个 customerID 作为测试数据。1TOR1234(或 Marge 的编号)返回 10 来表明 Marge 的能源账单增幅为 10%。1TOR5678(或 Homer 的编号)返回 20 来表明 Homer 的能源账单增幅为 20%。这一次,Susan 选择了 EnergyIncreaseService 模块,并和以前一样,从菜单中选择 Test > Test Process Application 。在 Integration Test Client 中,Susan 选择使用 GetEnergyIncreaseServiceExport 作为要测试的组件,并输入 “1TOR1234”,如图 7 所示。
图 7. 使用 Integration Test Client 进行测试
跟预期的一样,测试返回结果为 10。对 1TOR5678 的另一项测试返回 20。在两种情况下,Integration Test Client 运行请求响应操作,并显示调用了 invoke 操作来获取结果,如图 8 所示。如果自行构建此应用程序,那么您也应该运行这些测试。
图 8. 运行 Integration Test Client
Susan 测试两个 customerID 后,她在 Customer Retainer 上运行 Refresh and Publish 命令,以便确认她的更新已转移到 Process Center 中。然后,Susan 通知 John,业务流程的第二部分已经完成。John 可以更新他为这个现有的应用程序创建的 Advanced Integration Service,然后在 Inspector 中执行测试。他的测试可以表明具有一个客户编号的客户的能源账单是否增加了,但增幅并不大。
现在轮到业务分析师 John 发现 Susan 公开的应用程序并在 Inspector 中测试它了。John 启动 Process Designer,并右键单击流程编辑器中的 Get Energy Bill Increase 活动。他选择 Activity Wizard 并将 Library Element Selection 更改为 Attach an existing Service or Process 。John 在 Advanced Integration Service 标题下找到 GetEnergyIncreaseService,如图 9 所示。
图 9. 附加一个现有服务
John 准备好测试了吗?没有。就像他之前在第 1 部分 中所做的那样,他需要实现决策 Increase Over Criteria。他还需要创建另一个用户界面来显示能源增幅是否低于标准。
他首先需要确定,能源增幅是否足够低,所以不应向客户告知节能服务。John 和 Susan 的企业实际上仅对能源账单显著增高的客户感兴趣。
John 和 Susan 决定将 15% 作为界限;也就是说,不会联系账单拥有 15% 或更低增幅的客户。他们将联系那些能源账单增幅高于 15% 的客户。
John 首先通过检查来确认 increaseMax 变量的默认值为 15,如图 10 所示。通过使用一个变量,John 知道,如果将来需要将该标准更改为一个不同的百分比,那么他只需更新默认值即可。他还在 Documentation 节添加了一段备注来解释默认值。
图 10. 选择一个变量默认值
他选择 “Increase Over Criteria” 角色网关,并在 Properties 的 Implementation 节中,设置要有此变量决定的流程中的路径。换句话说,如果从 Susan 的应用程序返回的 energyIncrease 变量小于或等于 increaseMax,那么该值将显示在 Display If Less Than Criteria 中。否则,该流程会继续获取拥有高于 15% 的增幅的客户的信息。
类似于第 1 篇文章 中设置网关路径,John 将该路径设置为 Display If Less Than Criteria ,如图 11 所示。
图 11. 设置决策网关中的路径
如果自行构建此应用程序,可以尝试设置该路径。创建网关是业务流程中的一种常见操作。或者,查看本文随带的流程应用程序。
出于教学用途,我们使用了一个简单的二选一决策。但是,对于在运行时可能存在许多条件的真实应用程序,您很可能会使用业务操作语言 (Business Action Language, BAL) 规则来创建决策服务。
接下来,John 创建了一个界面来显示能源增幅是否低于标准。因为我们已在第 1 篇文章 中讨论了如何创建一个用户界面,所以这里不会重复具体细节。John 有意显示的变量包括客户标识符 (customerID)、能源增幅阈值 (increaseMax) 和客户的能源增幅 (energyIncrease)。换句话说,John 希望表明客户的能源增幅低于该阈值。John 创建了用户界面,如图 12 所示。
图 12. 创建一个用户界面来显示信息
然后,John 使用 Inspector 来测试该用户界面。就像第1 部分 中在 Inspector 中执行的测试一样,我们不会显示详细信息。但是,该测试使用了 Susan 所使用的输入数据,即 Marge 的 customerID 1TOR1234。图 13 显示了 Inspector 中的测试。
图 13. Inspector 中的测试
图 14 显示了 John 在用户界面中看到的结果。
图 14. 显示测试结果
John 无法测试 Homer 的客户编号,该编号已超过阈值,因为还未完成该功能的业务流程。
John 创建第二个快照(如图 15 所示)来表明业务流程的第二次迭代已完成。
图 15. 创建快照
回页首
业务流程的最后一次迭代是,找到最适合节能计划的客户,即能源增幅高于设置为 15% 的阈值的人。从技术上讲,此次迭代使用一个业务对象或复杂类型将此客户的信息传递给业务流程。它还访问了一个后端系统来获取企业数据,然后将该数据从其在后端系统中的表示形式映射到业务流程中的业务对象。
首先由 Susan 使用 Integration Designer 开始其工作。Susan 使用了 Refresh and Publish 命令。您一定还记得,Integration Designer 被松散连接到 Process Center,Integration Designer 用户需要检查更新并将更新发布到 Process Center 运行时。
正常情况下,会使用一个适配器来连接后端系统。Integration Designer 拥有许多适配器来访问数据库和供应商的系统,比如 SAP®、Oracle®、企业内容管理系统。但是,出于本文的用途,我们将使用一些 Java 代码来模拟后端系统。
Susan 将一个 Java 组件拖放到 Assembly 编辑器画布上,将它重命名为 “BackendSystem”。然后,她单击 Add Interface 图标,如图 16 所示。
图 16. 向 Java 组件添加一个接口
类似于重用应用程序迭代,Susan 创建了一个名为 “CUSTINTERFACE” 的接口,它将模拟旧的计算机系统的接口。Susan 将该接口放在 Customer_Retainer_Library 中。然后,她使用 Integration Designer 中的业务对象编辑器来创建一个名为 CUST 的业务对象,该对象包含 EMAILADDRESS、FNAME 和 LNAME,如图 17 所示。
图 17. 创建 CUST 业务对象
在她的接口 CUSTINTERFACE 中,Susan 使用 CUST 业务对象来处理输入和输出。她还使用另一个名为 CUSTID 的输入来创建一个类似的输入和输出,以便在 Process Designer 活动 “Get Customer Information” 中使用它们,如图 18 所示。
图 18. 创建 CUSTINTERFACE 接口
可以在附加的流程应用程序中看到此接口。该流程应用程序还显示了包含库中的这些新工件的导航栏,如图 19 所示。
图 19. 包含新接口和业务对象的导航栏
在本文中,我们使用 Java 代码来模仿客户数据所在的一个旧后端系统。Susan 右键单击 Backend System 并在使用 Java 生成实现。创建基本的 Java 存根代码。然后,Susan 将 getCUST 方法替换为我们添加到本文的附件中的一个方法。另一个附件 BackendSystemComplete 显示了完整的 Java 代码。当然,本文的流程应用程序包含 Java 实现。Susan 在工作过程中频繁地刷新和发布她的代码,以保持 Process Center 与她在 Integration Designer 中所做的更改同步。
模拟的后端系统的用途是显示两个客户的客户 ID、电子邮件地址和它们的姓名。现在 Susan 的挑战变成:如何将旧后端系统的变量映射到 Process Designer 中的业务对象的变量?
此情形在使用集成应用程序时很常见,需要利用 Integration Designer 所提供了仲裁流工具。仲裁是一种动态解决系统之间的区别的方式。例如,就像 Susan 的情况,您有一个名为 “customerPersonal” 的变量包含客户信息,在另一个系统中也有一个名为 CUST 的变量包含类似的信息。仲裁为这两个变量建立映射关系。
Susan 将一个 Mediation Flow 组件拖放到 GetCustomerInformationService 与 BackendSystem 之间,如图 20 所示,并将它标为 “TransformData”。
图 20. 添加一个 Mediation Flow 组件
Susan 右键单击 TransformData 并选择 Generate Implementation 。她为她的工件创建一个文件夹(生成代码时的一个不错想法),并将它连接到 Mediation Flow 编辑器。
此编辑器将一个接口映射到一个引用,在本例中是将 GetCustomerInformationService(来自 Business Process Manager)映射到 CUSTINTERFACE(来自后端系统)。我们将介绍构建一个映射的大部分步骤,您可查阅本文所提供的流程应用程序来查看结果。
在 Mediation Flow 编辑器中,Susan 单击 invoke 方法并选择 Operation Map 作为模板。她接受默认值并继续操作。这会连接到映射的 Request 部分;也就是,对后端系统的数据请求。双击输入映射就会建立映射。在这里,会将接口中的元素连接到引用。Susan 将 customerID 连接到 CUSTID,将 email 连接到 EMAILADDRESS,将 firstName 连接到 FNAME,并将 lastName 连接到 LNAME。
连线会创建一个 MOVE 命令来表明从 GetCustomerInformationService 移动数据,如图 21 所示。
图 21. 从 GetCustomerInformationService 移动数据
连线通过将数据发送到 CUSTINTERFACE 来完成,如图 22 所示。
图 22. 将数据移动到 CUSTINTERFACE
有时在对后端系统的调用中,也会出现失败。例如,后端系统已关闭。一个不错的想法是向输入映射添加一个 Fail 终端,以便在运行时出错时,您能够了解错误发生在何处。Susan 通过从面板的 Error Handling 节拖出一个 Stop 图标,并将 Stop 连接到 Fail 终端来完成此任务,如图 23 所示。
图 23. 添加一个 fail 终端
然后,Susan 在 Response 选项卡上执行同样的操作。这是因为映射有两个方向,从 IBM BPM 向后端系统传输数据,以及反向映射。
她的连线是前一个映射的反方向:EMAILADDRESS 到 email,FNAME 到 firstName,以及 LNAME 到 lastName。请注意,Susan 不需要将 CUSTID 连接到 customerID,因为客户 ID 被用作查找客户信息的一个关键,而且返回值时不需要使用它。Susan 还为响应情形添加了错误处理。
Susan 关闭 Mediation Flow 编辑器。Susan 将 GetCustomerInformationService 导出连接到 TransformData 仲裁流,然后将该仲裁流连接到 BackendSystem,如图 24 所示。
图 24. 连接 Mediation Flow 组件
然后,Susan 使用 Refresh and Publish 命令更新 Process Center。像所有优秀的开发人员一样,她使用 Integration Test Client 对她在 Integration Designer 中的工作执行单元测试。她测试 GetCustomerInformationService。使用客户 ID 1TOR5678,因为此 ID 超出了标准。结果提供了 ID 1TOR5678 的客户信息。我们之前已给出此测试,所以这里不再赘述。然后,Susan 通过电话联系了 John,让他知道她已完成其流程应用程序的最后一次迭代的工作。
John 再一次完成该流程应用程序的工作。他需要创建一个用户界面,将一封电子邮件发送给很可能加入节能计划的客户。他右键单击 Send Email To Customer 并选择 Activity Wizard 。
与之前在用户界面中所做的一样,John 删除了一些自动添加到用户界面中的变量。他只想使用来自 customerOutput 业务对象的两个变量:email 和 firstName。他还想要使用 energyIncrease。这些变量允许他发送一封包含客户的名字的电子邮件。它们还允许他让客户注意到能源成本的增加,这使客户加入节能计划的可能性变得更大。他使用自定义 HTML 标记添加了一条电子邮件备注。John 的用户界面如图 25 所示。
图 25. 发送给客户的电子邮件的用户界面
然后,他使用客户编号 1TOR5678(该客户的能源账单增幅高于阈值)测试流程应用程序。使用 Inspector 执行测试已在第 1 篇文章 中讨论,所以我们不再赘述。结果是向很可能加入节能计划的客户发送一封电子邮件,如图 26 所示。
图 26. 发送给可能加入节能计划的客户的电子邮件
最后,John 创建其流程应用程序的一个快照,如图 27 所示。
图 27. 完整的业务流程的快照
回页首
创建这个快照后,这个由两部分组成的文章系列的第二部分就完成了。在第 1 部分 中,您了解了 Process Designer、Integration Designer 和 Process Center 之间的关系,还了解了这种技术关系如何成为参与一个项目的员工的协作关系的基础。您学习了如何创建一个业务流程,在 Process Designer 中创建在 Integration Designer 中实现的服务。学习了如何在 Integration Designer 中执行单元测试和在 Process Designer 中的 Inspector 中执行系统测试。还学习了如何构建用户界面和在一次开发迭代结束时创建快照。
在本文中,我们同样重点介绍了 IBM BPM 如何促进业务组织的自然协作。这一次,我们的技术专家 Susan 将 Integration Designer 中的现有应用程序推送到 Process Designer 中。您看到了如何让 Integration Designer 中的应用程序对在 Process Designer 中工作的人可见。还看到了如何访问一个后端系统,企业将大量数据存储在这个系统中。不幸的是,该数据通常具有不同的格式,所以您还学习了如何使用映射将数据转换为不同环境中需要的格式。
构建大型、复杂的业务流程时,利用所有人才来设计和实现业务流程是最佳的战略。IBM BPM 提供了高效、协作式地利用业务分析师和技术人员的途径。
感谢 Paul Pacholski 审阅本系列文章。
回页首
描述 | 名字 | 大小 |
---|---|---|
代码示例 | code_sample.zip | 470KB |