本文通过一个小的业务场景说明如何使用 WebSphere Process Choreographer 来构建和测试要求多个流程实例并行执行的异步业务流程。该业务流程将同时调用多个子流程,并等待从子活动得到所需的响应。
引言
本文的目标读者是希望了解如何使用 IBM® WebSphere® Process Choreographer(以下称为 Process Choreographer)实现并行工作流的基本知识的开发人员。本文将说明如何使用相关集来唯一地标识业务流程实例。本系列的第 1 部分说明了如何使用设计模式构建和测试包含多个基本活动的业务流程。
先决条件
为了运行本文中的示例,您将需要安装 IBM WebSphere Studio Application Developer Integration Edition V5.1(以下称为 Application Developer),并安装最新的软件更新。


|
回页首 |
|
业务要求
ChocDino, Inc. 的业务流程更改
 |
ChocoDino, Inc. 的业务运行一直很好,但有时候为客户配送巧克力恐龙时存在延迟。因此,该公司开始与多家托运公司合作,以改进配送流程。现有的配送流程依赖于顺次寻找托运公司配送订单的方式。新流程将在需要配送订单时通知多家公司,第一家对请求进行响应的公司将处理其配送。
|
目标
阅读了本文后,您应该能够完成以下任务:
- 创建业务流程执行语言(Business Process Execution Language,BPEL)托运与投标流程。
- 了解如何使用相关集实现业务流程实例间的交互。
相关集
在可中断的业务流程的生命周期中,当活动调用请求时,可能需要数秒钟到几个月来获取响应。为了提高业务流程的性能,您可能还希望在等待响应前并行调用多个请求。存在多个业务流程实例时,需要能够唯一地标识返回响应的流程实例。在异步消息传递中,可以使用相关 ID 来标识唯一的请求-响应消息对。在 BPEL 中,会将同一个概念与相关集一起使用,从而允许通过映射多个消息部件来以松散耦合的方式唯一地标识业务流程。属性来自业务域,而其值来自运行时的特定业务流程实例。典型的属性包括帐户号、客户号、请求号等。
相关集的基本规则
您需要遵循三个基本规则:
- 当将给定相关 ID 与活动一起使用时,此活动必须将所有的相关性属性作为其消息中的一部分使用。消息可以具有更多的部件,但必须具有相关性属性。
- 相关性的每个属性必须对其进行协调的每条消息使用一个别名。此别名将属性的值连接到消息中的部件。
- 具有要传入流程中的消息或事件的所有活动都必须具有与其关联的相关集。
如何处理 ChocoDino, Inc. 中的情况
在本文中,将使用 WebSphere Studio Application Developer Integration Edition V5.1 创建 BPEL for Web Services (BPEL4WS) 业务流程。您将创建一个托运订单流程,以将接受订单请求输入,然后通过执行以下任务处理订单:
- 请求各个托运人投标。
- 接受第一个托运人提供的托运投标。
在本文中,您将构建 ShipChocoDinoOrder 主业务流程来请求运算投标,并接受第一个报价。
图 1. ShipChocoDinoOrder 流程

您还将构建 ShipChocoDinoBid 子业务流程来让托运代表提供报价。
图 2. ShipChocoDinoBid 流程

设置环境
设置 WebSphere Studio Application Developer Integration Edition V5.1
启动 Application Developer:从“开始”菜单:选择 Programs => IBM WebSphere Studio => Application Developer Integration Edition。将打开一个对话框,让您选择工作区目录的位置。输入 <drive_letter>\chocodino\workspace 并单击 OK。Application Developer 将启动,并打开一个空工作区。
现在必须启用服务器锁定支持。选择 Window => Preferences,在弹出窗口的导航帧中单击 J2EE,选择 Enable server targeting support 并单击 OK。
图 3. 启用服务器锁定支持

创建新 Service 项目
在 Services 视图中,右键单击 Service Projects 并选择 New => Service Project。使用 ChocoDino 作为项目名称,将缺省项目位置保持原样。单击 Finish。
图 4. 创建名为 ChocoDino 的新项目

创建 Shipping Order 业务流程
创建新业务流程
将构建包含概述中定义的三个主要步骤的 ShipChocoDinoOrder 流程:
- 创建
while 循环,以选择多个托运人。
- 向每个托运人提交托运巧克力恐龙的投标请求。
- 等待从第一个托运人的响应,并使用托运结果进行应答。
右键单击 ChocoDino 项目,并选择 New => Business Process。对于 Package,输入 com.chocodino.process;在 File name 字段中输入 ShipChocoDinoOrder。单击 Next。
图 5. 创建新 ShipChocoDinoOrder 流程

创建基于序列的流程
选择 sequence-based BPEL process 并单击 Finish。将在 Process Editor 中打开 ShipChocoDinoOrder.bpel 业务流程。
图 6. Sequence-based process

配置服务接口
必须为业务流程配置流程接口。这是其他对象与此流程进行交互的服务接口。选择 ShipChocoDinoOrderInterface.wsdl 文件,并配置以下端口类型及其关联的部件。
图 7. ShipChocoDinoOrderInterface.wsdl 的详细信息

设置流程参数
在 Services 视图中,打开 ShipChocoDinoOrder.bpel 业务流程,并选择 ShipChocoDinoOrder 节点。在 Details 窗格中,向下滚动到 Server 选项卡,并选择 Process is long-running,以指示流程是可中断的。将 Target namespace 设置为 http://www.chocodino.com(ChocoDino Internet 地址),并按 Ctrl-S 键。您将看到警告 The deployment code for this process needs to be generated,此问题将在稍后部署流程时进行处理。
图 8. ShipChocoDinoOrder.bpel 中的 Server 选项卡

配置流程接口,第 1 部分
通过将流程 Receive 和 Reply 活动与合作伙伴的接口定义关联,从而将流程接口配置为在 ShipChocoDinoOrderInterface.wsdl 中创建的接口。您将创建使用 ShipOrderInterface 作为流程接口类型的 ShipOrder 合作伙伴。为业务流程设置合作伙伴和合作伙伴链接。
右键单击右上部的 default PartnerLink,将其命名为 ShipOrder。在 Details 属性窗格中,切换到 Description 页。Name 应设置为 ShipOrder。
仍然在 Details 窗格中,切换到 Implementation 选项卡,并单击 Partner Link Type 旁边的 New。New Partner Link Type 对话框将打开,其中包含新合作伙伴链接类型 ShipOrderPLT。让 Number of Roles 保持为 One,并在 First Role 字段中输入 ShipOrderFirstRole。
图 9. 输入 ShipOrderFirstRole

配置流程接口,第 2 部分
单击 Port Type File 旁边的 Browse ,并导航到 ChocoDino => com => chocodino => process => ShipChocoDinoOrderInterface.wsdl。选择 ShipOrderPortType 作为 Port Type 并单击 OK。
图 10. 选择 ShipOrderPortType

您的 Partner Link 面板应与以下所示类似。单击 OK。
图 11. ShipOrder 合作伙伴链接面板

定义合作伙伴链接
因为正在将接口 (Port Type) 定义到流程中,因此必须交换角色。流程角色/端口类型用于那些希望将消息发送到流程中的对象。缺省情况下,会将之前定义的角色分配用于将消息向外发送到合作伙伴。在大多数情况下,合作伙伴链接类型将是正确的选择。
使 ShipOrder 合作伙伴在布局区域仍然处于选中状态,切换到 Implementation 选项卡。使用 <--> 按钮交换 Partner's Role 和 Process Role。使用 Ctrl-S 保存更改。
图 12. 交换合作伙伴和流程角色

设置 Receive 和 Reply,以处理正确的消息。
选择 Receive 活动,并切换到 Implementation 选项卡。Partner Link 应为 ShipOrder,而 Port Type 应为 ShipOrderPortType。使用下拉菜单选择 shipOrder 作为 Operation。
对于 Request,请单击 New 并输入 shipOrderRequest。单击 OK
图 13. 配置 Receive 活动

对 Reply 活动重复相同的步骤。选择 Reply 活动,并切换到 Implementation 选项卡。Partner Link 应为 ShipOrder,而 Port Type 必须选择 ShipOrderPortType。使用下拉菜单选择 shipOrder 作为 Operation。
对于 Response,请单击 New。输入 shipOrderResponse 并单击 OK。
配置顺序相关集
向相关集中添加新相关集。输入 Order 作为名称。
选择 Properties 选项卡,然后单击 New 并选择 ShipChocoDinoOrderInterface.wsdl 文件。在 Name 字段中输入 orderId,在 Build-in Type 字段中输入 xsd:string。
单击 New,以创建新别名。选择 ShipChocoDinoOrderInterface.wsdl 文件,并选择 shipOrderRequest。然后选择 orderId,并单击 OK。新别名将添加到列表中,并与初始 Receive 活动一起使用。
再次单击 New,以创建另一个新别名。选择 ShipChocoDinoOrderInterface.wsdl 文件并选择 receiveBidRequest,然后选择 orderId 并单击 OK。新别名将添加到列表中,并与初始 ReceiveBid 活动一起使用。
单击 OK,以完成相关集的配置。
图 14. 配置 Order 相关集

创建 Shipping Bid 业务流程
创建新业务流程
构建 ShipChocoDinoBid 流程,以允许托运人提交巧克力恐龙订单的托运成本。
右键单击 ChocoDino 项目,并选择 New => Business Process。在 Package 字段中输入 com.chocodino.process。在 File name 字段中输入 ShipChocoDinoBid 并单击 Next。
图 15. 创建新 ShipChocoDinoBid

创建基于序列的流程
选择 Sequence-based BPEL Process 并单击 Finish。将在 Process Editor 中打开 ShipChocoDinoOrder.bpel 业务流程。
配置服务接口
选择 ShipChocoDinoBidInterface.wsdl 文件,并配置以下端口类型及其关联的部件:
图 16. ShipChocoDinoBidInterface.wsdl 的详细信息

设置流程参数
在 Services 视图中,打开 ShipChocoDinoBid.bpel 业务流程,并选择 ShipChocoDinoBid 节点。在细节窗格中,向下滚动到 Server 选项卡,并选择 Process is long-running。将 Target namespace 设置为 http://www.chocodino.com。您将看到警告 The deployment code for this process needs to be generated,此问题将在稍后部署流程时进行处理。
图 17. ProcessChocoDinoBid.bpel 中的 Server 选项卡

配置流程接口
将流程接口配置为在 ShipChocoDinoBidInterface.wsdl 中创建的接口:右键单击右上部的 default PartnerLink,将其重命名为 ShipBid。
仍然在 Details 窗格中,切换到 Implementation 选项卡,并单击 Partner Link Type 旁边的 New。将打开 New Partner Link Type 定义对话框,其中包含新合作伙伴链接类型 ShipBidPLT。让 Number of Roles 保持为 One Role,并在 First Role 字段中输入 ShipBidFirstRole。
接下来,单击 Port Type File 旁边的 Browse ,并导航到 ChocoDino => com => chocodino => process => ShipChocoDinoBidInterface.wsdl。选择 ShipBidPortType 作为 Port Type 并单击 OK。
您的 Partner Link 面板应与以下所示类似。单击 OK。
图 18. Partner link 面板

使 ShipBid 合作伙伴在布局区域仍然处于选中状态,切换到 Implementation 选项卡。使用 <--> 按钮交换 Partner's Role 和 Process Role。使用 Ctrl-S 保存更改。
图 19. 交换 Partner's Role 和 Process Role

设置 Receive 和 Reply,以处理正确的消息
选择 Receive 活动,并切换到 Implementation 选项卡。Partner Link 应为 ShipBid,而 Port Type 应为 ShipBidPortType。使用下拉菜单选择 bidRequest 作为 Operation。
对于 Request,单击 New 并输入 bidRequestRequest,然后单击 OK。
图 20. 配置 Request 活动

接下来,选择 Reply 活动,并将其从流程中删除。
开发 Shipping Order 业务流程
您已经为具有 Receive 和 Reply 的业务流程创建了初始框架。现在可以开始添加用于请求托运投标的活动。您的业务流程接受一个参数 (orderId) 作为通过 Receive 活动的输入。业务流程依赖于通过 Reply 活动的三个参数:orderId、cost 和 shipperId。现在添加各种活动,以完成流程,如图 1 中的 ShipChocoDinoOrder 流程 BPEL 关系图中所示。
SelectShipper Staff 活动
添加一个 Staff 活动,并将其命名为 SelectShipper。
选择 Implementation 选项卡,并浏览到 ShipChocoDinoOrderInterface.wsdl。使用 StaffPortType 并选择 selectShipper 操作。对于 Request,单击 New 并输入 selectShipperRequest,然后单击 OK。为 Response 添加新变量 selectShipperResponse。
选择 Staff 选项卡,并将 Potential Owner 角色谓词修改为 Everybody,从而让 ChocoDino 的所有雇员都能执行 Potential Owner、Editor 和 Reader 成员操作。在较大的公司中,会将这些角色分配给特定的用户组。
prepSelectShipper Assign 活动
添加 Assign 活动,并将其命名为 prepSelectShipper。
选择 Implementation 选项卡,并添加以下映射:
| 源 |
目标 |
| Fixed Value > (xsd:boolean) > true |
selectShipperResponse > selectShipperResponse > selectAnother |
| shipOrderRequest > shipOrderRequest > orderId |
selectShipperRequest > selectShipperRequest > orderId |
While 活动
添加 While 活动:选择 Condition 选项卡,将值更改为 Expression,并将 Java 代码修改为:
return getSelectShipperResponse().getSelectAnother().
|
将 SelectShipper Staff 活动拖放到 While 活动中。
IssueBid Invoke 活动
将 ShipChocoDinoBid.bpel 拖放到 BPEL editor 上,以创建新的合作伙伴链接。
添加 Invoke 活动,并将其命名为 IssueBid。
选择 Implementation 选项卡。选择 ShipChocoDinoBid 作为 Partner Link。对于 Request,单击 New 并输入 issueBidRequest,然后单击 OK。
图 21. 配置 IssueBid Invoke 活动

prepIssueBid Assign 活动
添加 Assign 活动,并将其命名为 prepIssueBid。
选择 Implementation 选项卡,并添加以下映射:
| 源 |
目标 |
| shipOrderRequest > shipOrderRequest > orderId |
issueBidRequest > bidRequestRequest > orderId |
| selectShipperResponse > selectShipperResponse > shipperId |
issueBidRequest > bidRequestRequest > shipperId |
ReceiveBid Receive 活动
添加 Receive 活动,并将其命名为 ReceiveBid。
切换到 Implementation 选项卡,并单击 Partner Link Type 旁边的 New。New Partner Link Type 对话框将打开,其中包含新合作伙伴链接类型 ReceiveBid PLT。让 Number of Roles 保持为 One Role,并在 First Role 字段中输入 ReceiveBidFirstRole。
接下来,单击 Port Type File 旁边的 Browse,并导航到 ChocoDino => com => chocodino => process => ShipChocoDinoOrderInterface.wsdl。为 Port Type 选择 ReceiveBidPortType。单击 OK。
您的 Partner Link 面板应与以下所示类似。单击 OK。
图 22. Partner link 面板

使 ReceiveBid 合作伙伴在布局区域仍然处于选中状态,切换到 Implementation 选项卡。使用 <--> 按钮交换合作伙伴和流程角色。使用 Ctrl-S 保存更改。
图 23. 交换合作伙伴和流程角色

选择 ReceiveBid 活动,并选择 Implementation 选项卡。选择 receiveBid 作为 Operation。对于 Response,单击 New 并输入 issueBidResponse。单击 OK。
prepReply Assign 活动
添加 Assign 活动,并将其命名为 prepReply。
选择 Implementation 选项卡。添加以下映射:
| 源 |
目标 |
| shipOrderRequest > shipOrderRequest > orderId |
shipOrderResponse > shipOrderResponse > orderId |
| selectShipperResponse > selectShipperResponse > shipperId |
shipOrderResponse > shipOrderResponse > shipperId |
| receiveBidResponse > receiveBidRequest > cost |
shipOrderResponse > shipOrderResponse > cost |
将相关集分配给活动
选择初始 Receive 活动:
选择 Correlation 选项卡,并单击 Add,从而向表单添加相关集。将 Initiation 值更改为 Yes,并确保 Correlation Set 值设置为 Order。
图 24. 为 Receive 活动配置相关集

选择 ReceiveBid 活动:
选择 Correlation 选项卡,并单击 Add,从而向表单添加相关集。确保 Initiation 值为 No,而 Correlation Set 值为 Order。
图 25. 为 ReceiveBid 活动配置相关集

开发 Shipping Bid 业务流程
您已经为具有 Receive 的业务流程创建了初始框架。接下来要添加 Staff 活动来提供成本值。您的业务流程接受两个参数 orderId 和 shipperId 作为通过 Receive 活动的输入。此业务流程使用三个参数对 ShippingChocoDinoOrder 流程进行应答:orderId、cost 和 shipper(通过一个 Invoke 活动)。现在添加各种活动,以完成流程,如图 2 中的 ShipChocoDinoBid 流程 BPEL 关系图中所示。
QuoteCost Staff 活动
添加 Staff 活动,并将其命名为 QuoteCost。
选择 Implementation 选项卡,并浏览到 ShipChocoDinoBidInterface.wsdl。使用 ShipperStaffPortType 并选择 quoteCost 操作。对于 Response,单击 New 并输入 quoteCostRequest。单击 OK。另外,为 Response 添加新变量 quoteCostResponse。
选择 Staff 选项卡。将 Potential Owner 角色谓词修改为 Everybody。
prepQuoteCost Assign 活动
添加 Assign 活动,并将其命名为 prepQuoteCost。
选择 Implementation 选项卡,并添加以下映射:
| 源 |
目标 |
| bidRequestRequest > bidRequestRequest > orderId |
quoteCostRequest > quoteCostRequest > orderId |
| bidRequestRequest > bidRequestRequest > shipperId |
quoteCostRequest > quoteCostRequest > shipperId |
SubmitBid Invoke 活动
将 ShipChocoDinoOrder.bpel 拖放到 BPEL Editor 上,以创建新合作伙伴链接。选择 Implementation 选项卡,并将 Partner Link 更改为 ReceiveBid。
添加 Invoke 活动,并将其命名为 SubmitBid。
选择 Implementation 选项卡,并选择 ShipChocoDinoOrder 作为 Partner Link。选择 receiveBid 作为 Operation。对于 Response,单击 New 并输入 submitBidRequest。单击 OK,并使用 Ctrl-S 保存更改。
图 26. 配置 SubmitBid Invoke 活动

prepSubmitBid Assign 活动
添加 Assign 活动,并将其命名为 prepSubmitBid。
选择 Implementation 选项卡,并添加以下映射:
| 源 |
目标 |
| bidRequestRequest > bidRequestRequest > orderId |
submitBidRequest > receiveBidRequest > orderId |
| bidRequestRequest > bidRequestRequest > shipperId |
submitBidRequest > receiveBidRequest > shipperId |
| quoteCostResponse > quoteCostResponse > cost |
submitBidRequest > receiveBidRequest > cost |
生成部署代码
为 ShipChocoDinoOrder 和 ShipChocoDinoBid 生成部署代码
在 Services 视图中,展开 com.chocodino.process,右键单击 ProcessChocoDinoOrder.bpel 并选择 Enterprise Services => Generate Deploy Code。
将随即打开 Generate BPEL Deploy Code 向导。缺省情况下,该流程仅通过 JMS 接口绑定公开。之所以使用 JMS,是因为此流程是长时间运行的业务流程。如果未将该流程指定为长时间运行,则可以选择 EJB(默认)、JMS、SOAP/HTTP 或 SOAP/JMS 绑定。单击 OK,以生成项目的部署代码。
图 27. 为 ShipChocoDinoOrder.bpel 生成部署代码

重复相同的步骤,以为 ShipChocoDinoBid process 生成部署代码。
使用单元测试环境
创建服务器和服务器配置
选择底部的 Tasks 选项卡旁边的 Servers 选项卡。在窗格中单击右键,并选择 New => Server and Server Configuration。将服务器命名为 TestServer,并确保 Server Type 为 WebSphere V5.1 => Integration Test Environment。单击 Finish。
将业务流程 EAR 添加到测试服务器。在 Servers 视图中右键单击 TestServer,并选择 Add and Remove Projects。向 Configured projects 添加 ChocoDinoEAR 并单击 Finish。
图 28. 将 ChocoDinoEAR 添加到 Configured projects 列表

创建表和数据源并发布
右键单击 TestServer 并选择 Create tables and datasources。确认了已成功创建了相关表后,请在完成对话框上单击 OK。
再次右键单击 TestServer 并选择 Publish。看到消息 Publishing was successful 时,单击 OK,以验证流程已部署。在 Servers 视图中右键单击 TestServer,并单击 Show deployed processes。应会随即打开 Deployed Processes 视图,在其中包括您的流程。仅在服务器停止时才能进行此操作。
使用 Business Process Web Client
右键单击 TestServer,以返回 Servers 视图。选择 Start。
服务器启动后,将使用 Business Process Web Client 来测试流程。在 Servers 视图中,右键单击 TestServer 并选择 Launch Business Process Web Client。将会在浏览器窗口中打开 Business Process Web Client。还可以从外部浏览器使用以下 URL 打开 Web Client :http://localhost:9080/bpe/webclient。
单击 Web Client 左栏中的 My Templates。
应该列出 ShipChocoDinoOrder 和 ShipChocoDinoBid 流程,并带有 Running 状态图标。
单击 ShipChocoDinoOrder Template Name。将在视图中显示模板定义。会列出您实现的 shipOrder 服务。
图 29. shipOrder 服务

输入 ChocoDino 订单数据
选择 shipOrder 服务链接。将随即打开 Process Input Message 面板。在 orderId 字段中输入 100001 并单击 Start Instance。将执行流程实例。
测试已完成的流程
检查流程的状态
在左栏中选择 Administered by Me,以显示已创建的流程实例的列表。流程应处于 Running 状态。选择 Process 链接,以查看详细信息。
图 30. 处于 Running 状态的 ShipChocoDinoOrder

测试成员活动
在左栏中选择 My To Dos。将随即列出已有的成员活动。选择 SelectShipper 并单击 Claim,以声明活动。
图 31. 检索处于 Ready 状态的 SelectShipper

单击 SelectShipper ,为 SelectAnother 输入 True,并为 shipperId 输入 1000011。单击 Complete,以完成流程。我们刚刚请求 shipperId 为 1000011 的公司投标,接下来我们还有请求其他公司投标。
图 32. SelectShipper 活动详细信息

重复上述步骤,创建 shipperId 为 1000012 的公司的投标请求。输入 False,指示不再请求另一个托运人投标。
测试相关集
通过使用其中一个 QuoteCost 活动来返回托运成本,从而测试相关集实现。成员活动声明并完成后,将向 ShipChocoDinoOrder 流程的 ReceiveBid 活动返回托运成本。
在左栏中选择 My To Dos,其中将列出现有的成员活动。选择其中一个 QuoteCost 活动,并单击 Claim 来声明活动。
图 33. 检索处于 Ready 状态的 QuoteCost

请注意 orderId 和 shipperId 的值。
单击 QuoteCost,并在 cost 字段中输入 20。单击 Complete,以完成流程并提交订单的托运成本。
图 34. 为 QuoteCost 活动输入成本

验证测试的结果
验证订单将由在刚刚完成的 QuoteCost 活动中标识的托运人进行托运:
在左栏中选择 Administered by Me。ShipChocoDinoOrder 处于 Finished 状态。选择流程链接,以查看流程的详细信息:
图 35. 查看流程状态

确认 cost 和 shipperId 与在前面执行的 QuoteCost 活动中看到的值匹配。
图 36. ShipChocoDinoOrder 流程的详细输出

shipperId 可能会与以上所示类似。
执行其他测试
要执行其他测试,请创建 ShipChocoDinoOrder 流程的多个实例,然后为每个流程实例创建多个投标请求。接下来,完成其中一个 QuoteCost 活动,并验证它对正确的(具有相同的 orderId)流程实例进行了应答。
结束语
 |
您已经构建了两个业务流程:ShipChocoDinoOrder,用于请求多个托运投标;ShipChocoDinoBid,用于提供托运成本和应答发出请求的流程。相关集用于标识发出请求的流程特定实例。ChocoDino 现在可以使用您的托运流程来加速其美味的巧克力恐龙的配送了。
|
致谢
作者希望向伊利诺斯州芝加哥的 JP Morgan 的资深软件开发人员 Katherine Wai 和 Ed Brasher 表示感谢,感谢他们对本文进行了专业的审阅。 |