IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

通过 WebSphere Process Choreographer 使用设计模式实现工作流,第 1 部分

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 中级

Fred Simmons (fredsid@us.ibm.com), 顾问,Software Services for WebSphere, IBM
Jeng Yoong Tan (jtan@us.ibm.com), 顾问,Software Services for WebSphere, IBM

2005 年 8 月 10 日

本文介绍如何构建和测试一个包含几个基本活动的业务流程。此业务流程将调用一个简单的 Web 服务来完成其中的一些活动。

引言

本文将向您介绍工作流的基本知识,并介绍如何使用 IBM® WebSphere® Process Choreographer(WebSphere Studio Application Developer Integration Edition V5.1 的一个组件)来实现它。本文还将介绍如何集成 Web 服务与 Process Choreographer 工作流。

先决条件

要运行本文中的示例,您需要安装 WebSphere Studio Application Developer Integration Edition V5.1(以下称为 Application Developer)以及最新的软件更新。

ChocoDino, Inc.

The Choco-Triceratops

在 1989 年,Kwesi Gadzi 举家从加纳搬迁到纽约的布鲁克林。在做了十年程序员之后,他决定开创自己的事业。Kwesi 注意到他的孩子们喜欢巧克力,也喜欢恐龙,所以他创办了 ChocoDino, Inc 公司,专门制造和销售形状像恐龙的巧克力。他如今出售四种类型的恐龙巧克力:

  • Choco-Triceratops,
  • White Chocolate Ankylosaurus
  • Cherry Chocolate Pterosaurs
  • Braciosaurs Brownie(人人喜爱的)

随着 ChocoDino, Inc 的发展,Kwesi 觉得他需要为他的巧克力制定一个订购流程。您将使用 WebSphere Process Choreographer 来为他实现这个业务流程。

您将学到的内容

在学习完本文后,您应该能够使用 WebSphere Process Choreographer 来做以下事情:

  • 使用 Services 向导和 Business Process 向导创建简单的恐龙巧克力订购流程。
  • 为恐龙巧克力业务流程添加 Receive、Reply、Assign、Invoke 和 Switch Activity。
  • 理解如何将一个子业务流程作为父业务流程的一部分加以包含。
  • 将 Web 服务作为恐龙巧克力业务流程的一部分加以包含。
  • 配置和使用 Staff Activity,它可以让 Kwesi 与您的业务流程相交互。
  • 使用 Application Developer 来自如地导航 Business Process Editor 和 Perspective。
  • 确定在 ChocoDino 业务流程的整个开发过程中的各种设计模式。




回页首


概述:ChocoDino 订购流程

Business Process Execution Language for Web Services (BPEL4WS) 是用于指定业务流程行为的一种语言。BPEL4WS 对 Web 服务交互模型加以扩展,使之支持业务事务。WebSphere Process Choreographer 实现了 BPEL4WS 标准,并增加了一些重要的功能,例如 Staff Activity 和 Java Snippet。人可以通过 Staff Activity 与工作流进行交互,而 Java Snippet 则可以让您向业务流程添加 Java 代码。

本文中的所有变量、合作伙伴链接和活动都以大写字母开头。用于设置的分配活动则以小写字母开头。虽然这种约定不是标准的,但它是个很好的做法,因为它突出显示相关的业务活动。

在本文中,您将使用 Application Developer,通过 BPEL4WS 构建 Chocolate Dinosaur Order Process。此流程将接受恐龙巧克力的订单作为输入。Chocolate Dinosaur Order 由客户号、对应四种恐龙巧克力类型之一的项目编号、唯一的订单标识符以及恐龙巧克力的数量组成。该业务流程将通过执行以下任务处理订单:

  • 尝试完成恐龙巧克力的订购。
  • 如果订购完毕,则配送恐龙巧克力并给客户开票。

此流程的输出是一个设置为 true 或者 false 的订购完成状态标志和关于订购状态的注释。在本文的最后,您将构建 Chocolate Dinosaur Order Process 主流程及其 Fulfill Chocolate Dinosaur Order Process 子流程,如下图所示:

Chocolate Dinosaur
Order Process
Fulfill Chocolate Dinosaur
Order Process
Chocolate Dinosaur Order Process Fulfill Chocolate Dinosaur Order Process




回页首


环境设置

设置 Application Developer

启动 Application Developer。从 Start 菜单中选择 Programs => IBM WebSphere Studio => Application Developer Integration Edition。这将打开一个对话框,在其中可以选择要存储工作区目录的位置。输入 <drive_letter>\chocodino\workspace 作为位置并单击 OK。Application Developer 将启动一个空的工作区。

现在必须启用服务器目标支持。选择 Window => Preferences 并在打开的窗口的导航条中单击 J2EE,然后选择 Enable server targeting support 并单击 OK


图 1. 启用服务器目标支持
启用服务器目标支持

在 Tasks 视图中,单击 Filters Filters。选择 On selected resource and its children,它会将 Tasks 视图中显示的消息限制为与您的组件相关的消息。


图 2. On selected resource and its children
On selected resource and its children.

创建新的 Service Project

在 Services View 中,右键单击 Service Projects 并选择 New => Service Project。使用 Project 名称 ChocoDino,并保留缺省值(项目位置)不变。单击 Finish


图 3. 创建名为 ChocoDino 的新项目
创建名为 ChocoDino 的新项目




回页首


创建初始业务流程

创建一个新的有序业务流程

您将构建 ProcessChocoDinoOrder 流程,它包含在概述中定义的三个主要步骤:

  1. 跟踪恐龙巧克力订购的完成情况,直到订购完成为止。
  2. 配送订购的恐龙巧克力。
  3. 给客户开票。

右键单击 ChocoDino 项目并选择 New => Business Process。输入 com.chocodino.process 作为 Package。输入 ProcessChocoDinoOrder> 作为 File 名称。单击 Next


图 4. 创建新的 ProcessChocoDinoOrder
创建新的 ProcessChocoDinoOrder

创建基于序列的流程

本项目中使用的两种业务流程是基于序列和流的。该 ProcessChocoDinoOrder 是一个 Sequence-based BPEL Process。单击 FinishProcessChocoDinoOrder.bpel 业务流程将在 Process Editor 中打开。


图 5. 基于序列的流程
ProcessChocoDinoOrder 是个基于序列的流程

配置服务接口

您必须为业务流程定义流程接口。这是让其他流程与此流程相交互的服务接口。为此流程创建一个新的 Port Type。

在 Services 视图中,双击 ProcessChocoDinoOrderInterface.wsdl 文件将其打开。在 Port Types 下,右键单击并选择 Add Child => Port Type

命名端口 ProcessOrderPortType

输入 ProcessOrderPortType 作为 Name 并单击 OK

选择您刚创建的 ProcessOrderPortType 端口类型。右键单击并选择 Add Child => Operation。 输入 processOrder 并单击 OK

创建 processOrderRequest 消息

选择 processOrder 操作。右键单击并选择 Add Child => Input。选择输入参数。 右键单击并选择 Set Message。保留缺省值 processOrderRequest 并单击 Finish

重复以上步骤,将输出和 processOrderResponse 参数添加到 processOrder 操作中。


图 6. 创建 processOrderRequest
创建 processOrderRequest 消息

在 Messages 中,应该出现两条新的消息:processOrderRequest 和 processOrderResponse。


图 7. 消息 processOrderRequest 和 processOrderResponse
两条新消息 processOrderRequest 和 processOrderResponse

向 processOrderRequest 消息添加一些部分

选择 processOrderRequest 消息。右键单击并选择 Add Child => Part。输入 customerId 并单击 OK。 重复以上步骤,为 orderIditemIdquantity 添加一些部分。

processOrderRequest 部分 类型 此字段的作用,由 ChocoDino, Inc. 确定
customerId xsd:string Kwesi 为每个客户帐号分配一个唯一的号码。例如,为 Betsy 的糖果店(位于长岛)分配 ID 为 1000-01 的客户。
orderId xsd:string ChocoDino, Inc. 收到的每份订单分配一个唯一的跟踪号。
itemId xsd:string 为四种产品中的每一种分配一个唯一的项目编号:
  • Choco-Triceratops 的项目编号为 100。
  • White Chocolate Ankylosaurus 的项目编号为 200。
  • Cherry Chocolate Dilophosaurus 的项目编号为 300。
  • Braciosaurs Brownie 的项目编号为 400。
quantity xsd:int 将配送给客户的以上四种产品之一 (itemId) 的数量。

将数量更改为 xsd:int 类型

要更改 quantity 变量的类型,请选择 quantity 部分。右键单击并选择 Set Type。将 Type 设置为现有的类型 xsd:int


图 8. 将数量设置为 xsd:int 类型。
将数量设置为 int 类型

向 processOrderResponse 消息添加一些部分

向消息 processOrderResponse 添加以下部分:类型为 xsd:boolean 的 isComplete 和类型为 xsd:string 的注释。

processOrderResponse 部分 类型 此字段的作用,由 ChocoDino, Inc. 确定
isComplete xsd:boolean 订购完成了吗?如果完成,则会将正确数量的恐龙巧克力配送给客户。
注释 xsd:string 配送应该包含的消息。

已完成的 ProcessChocoDinoOrderInterface.wsdl

您的 ProcessChocoDinoOrderInterface.wsdl 应该类似以下图形。按下 Ctrl-S 来保存更改。


图 9. 已完成的 ProcessChocoDinoOrderInterface.wsdl
ProcessChocoDinoOrderInterface.wsdl 应该类似此图

设置流程参数

在 Services 视图中,打开 ProcessChocoDinoOrder.bpel 业务流程。选择 ProcessChocoDinoOrder 节点。在详细信息面板中,向下滚动至 Server 选项卡。选中 Process is long-running 复选框。这表明该过程是可中断的。将 Target 名称空间设置为 ChocoDino, Inc 的 URL:http://www.chocodino.com。按下 Ctrl-S。您将看到警告“The deployment code for this process needs to be generated”。这将在后面部署流程时解决。


图 10. ProcessChocoDinoOrder.bpel 中的 Server 选项卡
单击 ProcessChocoDinoOrder.bpel 中的 Server 选项卡

配置流程接口

将流程接口配置为您在 ProcessChocoDinoOrderInterface.wsdl 中创建的接口。这可以通过将流程 Receive 和 Reply 活动与一个 Partner 的接口定义相关联来实现。您将创建一个 ProcessOrder 合作伙伴,它使用 ProcessOrderInterface 作为流程端口类型。为该业务流程设置 Partner 和 Partner 链接。

右键单击并选择右上角的缺省 PartnerLink,将它重命名为 ProcessOrder。在详细信息属性面板中,切换至 Description 页面。应该将 Name 设置为 ProcessOrder

还是在详细信息面板中,切换至 Implementation 选项卡,单击 Partner Link Type 旁边的 New。这将打开 New Partner Link Type 定义框,其中有 ProcessOrderPLT 的一个新的 Partner Link Type。保留 Number of Roles 为 One Role,并输入 ProcessOrderFirstRole 作为 First Role。


图 11. 输入 ProcessOrderFirstRole
将流程接口配置为您在 ProcessChocoDinoOrderInterface.wsdl 中创建的接口

单击 Port Type File 旁边的 Browse,导航至 ChocoDino => com => chocodino => process => ProcessChocoDinoOrderInterface.wsdl。选择 ProcessOrderPortType 作为 Port Type。单击 OK

您的 Partner Link 面板应该类似如下所示的面板。单击 OK


图 12. Partner Link 面板
浏览至 ProcessChocoDinoOrderInterface.wsdl,然后选择 ProcessOrderPortType

定义该合作伙伴链接面板

您要将接口 (Port Type) 定义到您的流程中,所以必须转换角色。Process Role/Port Type 是为那些希望将消息发送到您的流程中的人准备的。缺省情况下,指派前面定义的角色是为了将消息向外发送给合作伙伴。大多数情况下都假定为 Partner Link Type。

在布局区域中依然选择 ProcessOrder 合作伙伴,此时切换至 Implementation 选项卡。使用 <---> 按钮将 Partner's Role 转换为 Process Role。按下 Ctrl-S 保存更改。


图 13. 将 Partner's Role 转换为 Process Role
将 Partner's Role 转换为 Process Role

设置 Receive 以处理正确的消息

选择 Receive 活动并切换至 Implementation 选项卡。Partner Link 应该为 ProcessOrder,而 Port Type 必须选择 ProcessOrderPortType。通过下拉菜单选择 processOrder 作为 Operation。

对于 Request,单击 New 并输入 ProcessOrderRequest。单击 OK

设置 Reply 以处理正确的消息

选择 Reply 活动并切换至 Implementation 选项卡。Partner Link 应该继续为 ProcessOrder,Port Type 必须为 ProcessOrderPortType。通过下拉菜单选择 processOrder 作为 Operation。

对于 Response 消息,单击 New 并输入 ProcessOrderResponse。单击 OK

在关系图中,从 Variables 列表中删除变量占位符 InputVariable


图 14. 输入新的响应变量 —— ProcessOrderResponse
为 Reply 输入新的请求变量 ProcessOrderResponse




回页首


在业务流程中添加一个活动

添加 Assign 活动

添加 Assign 活动

您已经为业务流程创建了初始框架 —— 一个 Receive 和一个 Reply。现在可以为它们添加活动。您的业务流程接受以下四个参数作为输入(通过 Receive 活动):customerId、orderId、itemId 和 quantity 作为输入参数。该业务流程将以一个类型为 boolean 的 isCompleted 作为回应,并且可能有注释(通过 Reply 活动)。现在,您将添加 Assign 活动来填充 Reply 消息。

从 Palette 中选择一个 Assign 活动(“=”符号),将它拖到您的业务流程中的 Receive 和 Reply 活动之间。

将 Assign 活动重命名为 prepReply

将该活动重命名为 prepReply。现在,您的业务流程将如下所示。


图 15. 将该活动重命名为 prepReply
将该活动重命名为 prepReply

向 Reply 消息添加固定的注释

选择您刚添加的 prepReply 活动。切换至 Implementation 选项卡。使用 From 下拉框,选择 Fixed Value 并输入 ChocoDino order completed by Kwesi 作为值。使用 To 下拉框,选择 Variable or Part。选择 ProcessOrderResponse => comment


图 16. 将 comment 赋值为“ChocoDino order completed by Kwesi”指定为注释
将 ChocoDino order completed by Kwesi 赋值为注释

向 Reply 消息添加 isComplete

单击 New。使用 From 下拉框,选择 Fixed Value 并输入 false 作为值。选择类型 xsd:boolean。使用 To 下拉框,选择 Variable or Part。选择 ProcessOrderResponse => isComplete

按下 Ctrl-S 保存更改。


图 17. 将 isComplete 变量赋值为 false
将 isComplete 变量赋值为 false




回页首


生成部署代码

生成 ProcessChocoDinoOrder 的部署代码

在 Services 视图中,展开 com.chocodino.process,右键单击 ProcessChocoDinoOrder.bpel 并选择 Enterprise Services => Generate Deploy Code

这将打开 Generate BPEL Deploy Code 向导。缺省情况下将只通过 JMS 接口绑定公开该流程。JMS 用于任何长期运行的业务流程。如果您还没有选中“Process is long-running”复选框,则将向您提供以下选择:EJB(缺省)、JMS、SOAP/HTTP 或 SOAP/JMS 绑定。WebSphere Process Choreographer 的强大之处在于它可以同时实现长期运行的持久工作流和非持久微流。

单击 OK,为您的项目生成部署代码。

检查 ProcessChocoDinoOrder 的部署代码

在生成部署代码之后,通过单击 Navigator 面板中的选项卡切换至 J2EE Hierarchy 视图。

展开 EJB Modules = ChocoDinoEJB => Session BeansProcessChocoDinoOrderBean 是包含业务流程的 EJB。


图 18. 已部署的 ProcessChocoDinoOrderBean 代码
ProcessChocoDinoOrderBean 是一个非常长的名称




回页首


使用单元测试环境

创建服务器和服务器配置

选择底部的 Servers 选项卡。它位于 Tasks 选项卡附近。右键单击该面板并选择 New => Server and Server Configuration。将该服务器命名为 TestServer。确保 Server Type 为 WebSphere version 5.1 => Integration Test Environment。单击 Finish

向测试服务器添加业务流程 EAR。右键单击 Servers 视图中的 TestServer,选择 Add and Remove Projects。将 ChocoDinoEAR 添加到 Configured 项目中。单击 Finish


图 19. 将 ChocoDinoEAR 添加到已配置项目列表中
将业务流程 EAR 添加到测试服务器中。

创建表和数据源,然后发布!

创建表和数据源。再次右键单击 TestServer 并选择 Create tables and datasources。检查是否成功创建了表,在显示完成对话框后,请单击 OK

右键单击 TestServer,选择 Publish。单击 OK 关闭“Publishing was successful”对话框。确认流程已部署。右键单击 Servers 视图中的 TestServer,选择 Show deployed processes。这将打开 Deployed Processes 视图,其中应该会显示出您的流程。这一操作只有在服务器停止时才能完成。


图 20. 已部署的流程 ProcessChocoDinoOrder
已部署的流程 ProcessChocoDinoOrder。

使用业务流程 Web 客户机

返回到 Server 视图,右键单击该 TestServer。选择 Start

一旦服务器启动,将使用 Business Process Web Client 来测试该流程。在 Servers 视图中,右键单击 TestServer 并选择 Launch Business Process Web Client。Business Process Web Client 将在一个 Web 浏览器视图窗口中打开。您也可以使用地址 http://localhost:9080/bpe/webclient,从外部浏览器打开该 Web 客户机。

单击 Web 客户机左栏的 My Templates 链接。

其中应该列出流程 ProcessChocoDinoOrder,其运行状态图标为 Green Arrow indicates Running process

单击 ProcessChocoDinoOrder Template Name 链接。将显示模板定义以供您查看。您实现的 processOrder 服务将在其中列出。


图 21. processOrder 服务
显示 processOrder 服务

输入 ChocoDino 订购数据

选择 processOrder 服务链接。将显示 Process Input Message 面板。输入以下值。Process Instance Name 必须是唯一的。输入 Test1。Betsy's Sweet Shop(客户 ID 1000-01)订购 100 个 Braciosaurs Brownie(项目 Id 400)。选择 orderId1

进程输入消息
customerId 1000-01
itemId 400
orderId 1
quantity 100

单击 Start Instance。将执行该进程实例。选择 Web 客户机左栏的 Created By Me 链接。单击 Test1 进程链接。将 isComplete 的 Response 值设置为 false。注释设置为 ChocoDino order completed by Kwesi


图 22. Test1 的执行结果
isComplete 设置为 false。注释设置为 ChocoDino order completed by Kwesi。

关闭 Web 客户机。在 Servers 视图中右键单击 TestServer。从菜单中选择 Stop





回页首


开发 Web 服务

用 WebSphere Process Choreographer 实现 Web 服务

Cherry Chocolate Pterosaurs

Kwesi 决定使用 Web 服务将他的业务流程与在 ChocoDino, Inc 使用的其他软件组件连接起来。他将实现的这两个 Web 服务是用于配送和开票的。在开发这些 Web 服务之前,应该生成一个存根类。首先创建 Java 类来实现该业务逻辑,然后为该类生成 Web 服务。

在 Services 视图中,右键单击 ChocoDino 服务项目,选择 New => Package。键入 com.chocodino.model 作为包名称。单击 Finish 创建包。


图 23. 创建 com.chocodino.model 包
键入 com.chocodino.model 作为包名称。

创建 OrderProcessing 类

右键单击新创建的包并选择 New => Class。输入 OrderProcessing 作为类名称。单击 Finish。将以下方法添加到 OrderProcessing 类。通过 Ctrl-S 保存更改。

    /**
	* Stub method for shipping order
	*/
	public boolean shipOrder(String chocoCustomerId, String dinoOrderId) {
		System.out.println(
			"ChocoDino shipping order "
				+ dinoOrderId
				+ " to customer " + chocoCustomerId);
		return true;
	}
	/**
	* Stub method for billing customer
	*/
	public boolean billCustomer(String chocoCustomerId, String dinoOrderId) {
		System.out.println(
			"ChocoDino billing customer "
				+ chocoCustomerId
				+ " for order " + dinoOrderId);
		return true;
	}

为 OrderProcessing 生成 Web 服务

在 Services 视图中,选择 OrderProcessing.java。使用菜单栏选择 File => New => Service built from。 该关系图显示创建服务的两个选择:Java 或 EJB。在本例中使用 Java 类。单击 Next。 选中 OrderProcessing 前面的框,单击 Next


图 24. 为 OrderProcessing java 生成 Web 服务
为 OrderProcessing java 生成 Web 服务。

将包名称更改为 com.chocodino.wsdl。单击 Finish 生成 WSDL 文件。


图 25. 将包名称更改为 com.chocodino.wsdl
为 OrderProcessing java 生成 Web 服务。




回页首


开发初始的 ChocoDino 完成业务流程

完成恐龙巧克力的订购

完成恐龙巧克力订购流程

为 Fulfilling Chocolate Dinosaur 订购创建一个新的里程碑业务流程。此业务流程将包含一个 Staff 活动。Kwesi 必须检查他的恐龙巧克力的库存,以确定客户的订购是否可以完成。此业务流程将使用您刚创建的 OrderProcessing Web 服务。

创建 Fulfill ChocoDino Order 流程

从菜单中选择 File => Close All。右键单击 ChocoDino 项目,选择 New => Business Process。在 com.chocodino.process 包中创建名为 FulfillChocoDinoOrder(注意拼写)的新业务流程。单击 Next


图 26. 创建 FulfillChocoDinoOrder business 流程
创建名为 FulfillChocoDinoOrder 的新业务流程。

基于流的 BPEL 流程

选择 Flow-based BPEL Process 作为流程类型,单击 Finish


图 27. 基于流的 BPEL 流程
选择基于流的 BPEL 流程

向 FulfillChocoDinoOrderInterface.wsdl 添加端口、消息和部分

打开 FulfillChocoDinoOrderInterface.wsdl。为该流程创建一个新的 Port Type 服务接口 FulfillOrderPortType,详细信息如下所示。


图 28. FulfillChocoDinoOrderInterface.wsdl 的详细信息
FulfillChocoDinoOrderInterface.wsdl 的详细信息
fulfillOrderRequest 部分
orderId xsd:string
itemId xsd:string
quantity xsd:int

fulfillOrderResponse 部分
isComplete xsd:boolean
fulfilledQuantity xsd:int

更改部分类型

您可以使用 Parts 菜单,更改条目的 Parts 类型,例如数量。在 Messages 窗口中选择数量部分,并使用 Part Type 下拉框选择 xsd:int

按下 Ctrl-S 保存更改。关闭 FulfillChocoDinoOrderInterface.wsdl


图 29. 将数量设置为 xsd:int
在 Messages 窗口中选择数量部分,并使用 Part Type 下拉框选择 xsd:int.

FulfillChocoDinoOrder.bpel 的流程参数

打开 FulfillChocoDinoOrder.bpel。设置 Process 参数。选择 FulfillChocoDinoOrder 节点并选择 Server 选项卡。将目标名称空间更改为 http://www.chocodino.com。您必须指示此流程为长期运行的,因为在后续部分中将添加一个 Staff 活动。


图 30. 设置 FulfillChocoDinoOrder.bpel 中的 Process 参数
设置 FulfillChocoDinoOrder.bpel 中的 Process 参数

将合作伙伴链接重命名为 FulfillOrder 并配置流程接口

将缺省的 PartnerLink 重命名为 FulfillOrder。在 Implementation 选项卡中,配置流程接口以使用新的 FulfillOrderPortType。请记住浏览至新的 FulfillChocoDinoOrderInterface.wsdl 并转换角色以使 FulfillOrderFirstRole 为 Process Role。


图 31. 配置流程接口以使用新的 FulfillOrderPortType
配置流程接口以使用新的 FulfillOrderPortType

设置 Receive 和 Reply 活动

设置 Receive 和 Reply 活动以和新消息相关联。在 Receive 活动中,您应该创建 FulfillOrderRequest 变量。在 Reply 活动中,您需要一个 FulfillOrderResponse 变量。删除缺省的 InputVariable。Receive 和 Reply 的操作都是 fulfillOrder

Receive FulfillOrderRequest 字段
orderId
itemId
quantity

Reply FulfillOrderResponse 字段
isComplete
fulfilledQuantity

添加 prepReply 活动

右键单击 Reply 活动。选择 Insert Before => Assign。将赋值重命名为 prepReply


图 32. Insert Before => Assign 的上下文菜单
选择 Assign

给 prepReply 赋值

prepReply 中,选择 Implementation 选项卡。为 FulfillOrderResponse 的 isComplete 部分赋一个类型为 xsd:boolean 的固定值 true

将 FulfillOrderRequest 的数量部分指定为 FulfillOrderResponse 的 fulfilledQuantity 部分。请记住删除缺省的 InputVariable。

true (xsd:boolean) FulfillOrderResponse > isComplete
FulfillOrderRequest > quantity FulfillOrderResponse > fulfilledQuantity

按下 Ctrl-S 保存业务流程。

两个独立的执行线程

在关系图中,将三个组件拖到三个单独的列中,如下所示。由于这是一个 Flow 关系图,所以 Assign 和 Receive/Reply 有单独的执行线程。您希望这些操作依次发生,所以在下一个面板中将它们连接在一起。


图 33. Assign 和 Receive/Reply 有独立的执行线程
两个独立的执行线程。

通过流关系图创建连续路径

删除连接 Receive 和 Reply 活动的连线。

单击 Receive,然后单击 Receive 旁边的箭头 Arrow。 将连接器拖到 prepReply。对于 Reply,重复 prepReply 的这一步骤。现在,有一条连续的路径通过 Flow 关系图。


图 34. 通过 Flow 的连续路径
一个执行线程。

完成 FulfillChocoDinoOrder 流

此刻,您的 FulfillChocoDinoOrder 关系图应该如下图所示。


图 35. 测试前的 FulfillChocoDinoOrder 关系图
测试前的 FulfillChocoDinoOrder 关系图

生成 FulfillChocoDinoOrder 的部署代码

在 Services 视图中,展开 com.chocodino.process,右键单击 FulfillChocoDinoOrder.bpel ,选择 Enterprise Services => Generate Deploy Code

这将打开 Generate BPEL Deploy Code 向导。该过程将通过一个 JMS 接口绑定公开。JMS 用于任何长期运行的业务流程。

单击 OK,为您的项目生成部署代码。

创建表和数据源并发布项目

右键单击 TestServer,选择 Create tables and datasources。检查表成功创建之后,在完成对话框中单击 OK

右键单击 TestServer,选择 Publish。单击 OK,关闭“Publishing was successful”对话框。

右键单击 TestServer。选择 Start


图 36. 已部署的流程 FulfillChocoDinoOrder 和 ProcessChocoDinoOrder
已部署的流程 FulfillChocoDinoOrder 和 ProcessChocoDinoOrder。

使用 Business Process Web Client 测试 FulfillChocoDinoOrder

返回到 Servers 视图,右键单击 TestServer。选择 Start

服务器一启动,就可以使用 Business Process Web Client 测试流程。在 Servers 视图中,右键单击 TestServer,选择 Launch Business Process Web Client。Business Process Web Client 自己会在 Web 浏览器视图窗口中打开。

单击 Web Client 左栏中的 My Templates 链接。

流程 FulfillChocoDinoOrder 应该列在其中。单击 FulfillChocoDinoOrder Template Name 链接,将显示模板定义以供您检查。其中列出了您实现的 fulfillOrder 服务。


图 37. fulfillOrder 服务
Business Process Web Client 中的 fulfillOrder 服务

输入 ChocoDino fulfillOrder 数据

选择 fulfillOrder 服务链接。在 Process Input Message 面板中输入以下值。 Process Instance Name 必须是唯一的。输入 Test2。Betsy's Sweet Shop 订购了 100 个 Braciosaurs Brownie(项目ID 为 400)。选择 orderId 为 1。

流程输入消息
itemId 400
orderId 1
quantity 100

图 38. Test2 变量的输入
输入 400、1 和 100。

完成的 ChocoDino fulfillOrder 数据

单击 启动实例。 这将执行 Process Instance。在 Web Client 的左栏中选择 Created By Me。单击 Test2 流程实例链接。将 isComplete 的 Response 值设置为 true。将 fulfilledQuantity 的值为 100


图 39. Test2 的执行结果
将 isComplete 设置为 true。fulfilledQuantity 为 100。

关闭 Web Client。在 Servers 视图中右键单击 TestServer。选择 Stop





回页首


完成 ProcessChocoDinoOrder 业务流程

检查 ProcessChocoDinoOrder

继续开发 ProcessChocoDinoOrder,添加所有需要的活动以完成该业务流程。其中包含与一个 Web 服务相连接以完成 Ship order of chocolate dinosaursBill customer 部分。Dinosaur fulfillment process 是一个子业务流程—— FulfillChocoDinoOrder。完成的 ProcessChocoDinoOrder 流程应该如以下设计关系图所示。


图 40. Chocolate Dinosaur 订购流程
Chocolate Dinosaur 订购流程

添加 FulfillChocoDinoOrder 流程

在 ProcessChocoDinoOrder 流程中添加 FulfillChocoDinoOrder 子流程。从菜单中选择 File => Close All。 在 Services 视图中,双击 ProcessChocoDinoOrder.bpel,将其打开。从 Services 视图中选择 FulfillChocoDinoOrder.bpel 并将它拖到流程编辑器中。它将重新置于 Partner Link 下。

按下 Ctrl-S 保存更改。


图 41. 将 FulfillChocoDinoOrder 添加到 Partner Link
你好,FulfillChocoDinoOrder 先生!

添加 FulfillOrder 活动

通过在 Receive 活动下面添加 Invoke 活动,将 FulfillOrder 活动插入到 ProcessChocoDinoOrder 流程中。将它重命名为 FulfillOrder

选择 FulfillOrder 活动。右键单击并选择 Set Partner Link。拖动箭头,将它拖到 FulfillChocoDinoOrder Partner Link 上。

在仍然选择 FulfillOrder Invoke 活动的情况下,切换至 Implementation 选项卡。使用下拉列表将 Partner Link 设置为 FulfillChocoDinoOrder。在 Operation 中选择 fulfillOrder。

对于 request,单击 New,输入 FulfillOrderRequest,然后单击 OK

对于 response,单击 New,输入 FulfillOrderResponse,然后单击 OK

通过 Ctrl-S 保存更改。


图 42. FulfillOrder 实现
选择 fulfillOrder 作为 Operation。 添加 FulfillOrderRequest 和 FulfillOrderResponse。

添加 prepFulfillOrder 活动

添加 prepFulfillOrder 活动。

在 FulfillOrder 之前添加 Assign 活动,并将它重命名为 prepFulfillOrder

在选择 prepFulfillOrder 活动的情况下,切换至 Implementation 选项卡。将 orderId、itemId 和 quantity 变量从 ProcessOrderRequest 赋值给 FulfillOrderRequest。单击 New,为每个赋值创建一个新的映射对。

通过 Ctrl-S 保存更改。

即使 FulfillOrderRequest 使用与 ProcessOrderRequest 相同的部分名称,并且是它的一个子集,您也必须为每个调用创建一个新的请求变量。

ProcessOrderRequest FulfillOrderRequest
orderId orderId
itemId itemId
quantity quantity

修改 prepReply 活动以使用 FulfillOrder 的结果

由于 FulFillOrder 已经实现,所以 prepReply 活动应该使用该结果。将 isComplete 部分从 FulfillOrderResponse 赋值给 ProcessOrderResponse。按下 Ctrl-S 保存更改。


图 43. 为 isComplete 部分赋值
修改 prepReply 活动以使用 FulfillOrder 的结果。

添加 OrderProcessing Web 服务

将 OrderProcessing Web 服务添加到 ProcessChocoDinoOrder。使用从 Java 存根类创建的 OrderProcessing Web 服务。这将允许您从 ProcessChocoDinoOrder 调用两个服务调用:ShipOrder 和 BillCustomer。

在 Services 下,选择 OrderProcessingJava Service.wsdl 并将它拖到流程编辑器中。

单击 OK,将 OrderProcessing 添加到 Partner Link。

通过 Ctrl-S 保存更改。


图 44. 添加 OrderProcessing Web Service
添加 OrderProcessing Web Service。

添加 Switch 语句

在 FulfillOrder 活动之后插入一个 Switch 活动。


图 45. 添加 Switch
在 FulfillOrder 之后添加 Switch。

在 Switch 活动中添加 Case。

Kwesi 只想在完成订购之后才配送巧克力和给客户开票。如果订购没有完成,则 ProcessChocoDinoOrder 应该返回到调用流程并将 isCompleted 设置为 false。然后调用流程确定哪里出错,并重新提交订单或者通知客户他们订购的美味恐龙巧克力无法处理。

选择 Case 及其 Description 选项卡。将该 Case 重命名为 FulfillOrderCompleted

单击 Condition 选项卡。选择 Exclickion 作为值,并输入以下内容。请记住,Kwesi 只想在订购完成时才配送恐龙巧克力并给客户开票。

// only ship the chocolates and bill the customer if the order is completed
return getFulfillOrderResponse().getIsComplete();

请注意,BPEL4WS 变量 FulfillOrderResponse 是作为 Java 类实现的。

通过 Ctrl-S 保存更改。

该 Switch 语句蕴含这样的事实:如果 isCompleted 设置为 false,则会调用 Reply 活动。

Switch 语句的内容

利用下图指导您完成接下来的几个步骤。


图 46. Switch 语句及其内容。
添加 Switch。

添加 ShipOrder 以调用 Web 服务

添加 Invoke 活动。将它重命名为 ShipOrder

选择该活动。选择 Set Partner Link 图标Partner Link 图标。 拖动箭头,将它拖到 OrderProcessing Partner Link 上。

选择 ShipOrder。切换至 Implementation 选项卡。选择 shipOrder 作为 Operation。

单击 New 创建一个请求变量 ShipOrderRequest 和一个响应变量 ShipOrderResponse

按下 Ctrl-S


图 47. ShipOrder 实现
选择 shipOrder 作为 Operation。 添加 ShipOrderRequest 和 ShipOrderResponse。

添加 prepShipOrder

添加 Assign 活动并将它重命名为 prepShipOrder

在选择 prepShipOrder 活动的情况下,切换至 Implementation选项卡。

将各字段从 ProcessOrderRequest 赋值到 ShipOrderRequest。单击 New 创建新的映射对。

ProcessOrderRequest ShipOrderRequest
customerId chocoCustomerId
orderId dinoOrderId

添加 BillCustomer 以调用 Web 服务

添加 Invoke 活动。将它重命名为 BillCustomer

选择该活动。选择 Set Partner Link 图标 Partner Link icon。拖动箭头,将它放到 OrderProcessing Partner Link 上。


图 48. BillCustomer Partner Link
添加 BillCustomer Partner Link。

在仍然选择 BillCustomer 活动的情况下,切换至 Implementation 选项卡。选择 billCustomer 作为 Operation。

单击 New 创建一个请求变量 BillCustomerRequest 和一个响应变量 BillCustomerResponse

按下 Ctrl-S 保存更改。

添加 prepBillCustomer

添加一个 Assign 活动并将它重命名为 prepBillCustomer

选择 prepBillCustomer 活动。切换至 Implementation 选项卡。

将各字段从 ProcessOrderRequest 赋值到 BillCustomerRequest。单击 New 创建新的映射对。

ProcessOrderRequest BillCustomerRequest
customerId chocoCustomerId
orderId dinoOrderId

创建表和数据源,然后发布和使用 Web 客户机

右键单击 TestServer 并选择 Create tables and datasources。 在检查表成功创建之后,单击完成对话框中的 OK

右键单击 TestServer 并选择 Publish。单击 OK 关闭“Publishing was successful”对话框。

右键单击 TestServer。选择 Start

使用 Business Process Web Client 测试 ProcessChocoDinoOrder。





回页首


完成 FulfillChocoDinoOrder 业务流程

FulfillChocoDinoOrder 概述

完成 Chocolate Dinosaur Order Process

继续开发 FulfillChocoDinoOrder,添加所有需要的活动以完成业务流程。 这包含实现一个 Staff 活动。完成的 FulfillChocoDinoOrder 流程应该如以下设计关系图所示。

这一部分将实现两个 Assign 活动、一个 while 循环、一个 Staff 活动和一个 Java Snippet。

修改 FulfillChocoDinoOrderInterface.wsdl

人可以通过 Staff 活动与业务流程进行交互。Staff 是工作流的重要部分。

从菜单中选择 File => Close All。打开 FulfillChocoDinoOrderInterface.wsdl

修改 FulfillChocoDinoOrderInterface.wsdl 文件:添加 StaffPortType,如下图所示。


图 49. 添加 StaffPortType
添加 StaffPortType。

添加 RetrieveItems Staff 活动

打开 FulfillChocoDinoOrder.bpel。添加一个 Staff 活动。由于这是一个流关系图,所以它有独立的线程。 将它重命名为 RetrieveItems

选择 Implementation 选项卡。

浏览至 FulfillChocoDinoOrderInterface.wsdl。使用 StaffPortType 并选择 retrieveItem 操作。

在 request 中单击 New 并输入 RetrieveItemsRequest。单击 OK

添加 RetrieveItemsResponse 作为 response。

单击 Staff 选项卡。修改每个角色使得 Verb 为 Everybody。这将允许 ChocoDino 的所有员工执行 Potential Owner、Editor 和 Reader staff 操作。在更大规模的公司中,您将需要区分这些角色以便对用户加以细化。

通过 Ctrl-S 保存更改。您将看到几个错误,这些错误将在随后的步骤中解决。


图 50. RetrieveItems 实现
retrieveItem 操作。 创建 RetrieveItemsRequest 和 RetrieveItemsResponse。

添加 While Order is Not Fulfilled 循环

添加一个 While 循环。将它重命名为 WhileNotFulfilled。此循环将执行到 Kwesi 认为订购完成为止。如果 Kwesi 的恐龙巧克力数量和类型都满足,则会认为订购已执行并完成。如果 Kwesi 没有这些存货,则他可以执行以下操作之一:

  1. 输入库存中已有的巧克力的数量并认为订购完成。这样会将 isComplete 标志设置为 false 并且会在以下 Java Snippet 步骤中写入一条日志消息。父流程负责通知 ChocoDino 客户他们订购的美味巧克力没能完成配送。
  2. 将 isFulfilled 标志设置为 false。这将使得他可以在以后为该订单配送正确数量的巧克力时返回到该订单。

选择 Condition 选项卡和 Exclickion 下拉菜单来设置值。输入以下 exclickion。

 //	continue prompting Kwesi until the order is considered fulfilled.
 return !getRetrieveItemsResponse().getIsFulfilled();
 

将 RetrieveItems staff 活动移到循环里面。

按下 Ctrl-S


图 51. 添加 WhileNotFulfilled
添加 WhileNotFulfilled。

添加 prepNotFulfilled

添加一个 Assign 活动并将它重命名为 prepNotFulfilled

在选择 prepNotFulfilled 活动的情况下,切换至 Implementation 选项卡。

按如下方式为各字段赋值。对于不同的变量需要进行大量的赋值,所以要小心谨慎。

From [Fixed Value] To
0 (xsd:int) FulfillOrderResponse > fulfillQuantity
0 (xsd:int) RetrieveItemsRequest > quantityRetrieved
0 (xsd:int) RetrieveItemsResponse > quantityFilled
false (xsd:boolean) RetrieveItemsResponse > isFulfilled

From To
FulfillOrderRequest > orderId RetrieveItemsRequest > orderId
FulfillOrderRequest > itemId RetrieveItemsRequest > ItemId
FulfillOrderRequest > quantity RetrieveItemsRequest > quantityNeeded

添加 postRetrieveItems

添加另一个 Assign 活动。将它重命名为 postRetrieveItems

切换至 Implementation 选项卡。

按如下方式为各字段赋值。

From To
RetrieveItemsResponse > quantityFilled RetrieveItemsRequest > quantityRetrieved
RetrieveItemsResponse > quantityFilled FulfillOrderResponse > fulfillQuantity

将 postRetrieveItems 移到 Staff 活动下的 while 循环中。

用 Java Snippet 替换 prepReply

删除 prepReply 活动并用一个 Java Snippet 来替换它。将它命名为 prepReply

选择 Implementation 选项卡。Kwesi 希望在请求的恐龙巧克力数量是他能交付给客户的数量时才将 isCompleted 标志设置为 true。否则,响应 isCompleted 标志设置为 false。如果订购没有完成,则流程必须将审核消息记录到日志中。这将使他能够调整恐龙巧克力的库存。

// set isCompleted flag based on requested # of chocolate dinosaurs vs. what is delivered
getFulfillOrderResponse(true).setIsComplete(getFulfillOrderRequest().getQuantity() 
        <= getRetrieveItemsResponse().getQuantityFilled());
// log a audit message if the order is not completed
 if (!getFulfillOrderResponse().getIsComplete())
 {
     System.out.println("Order was not fulfilled for : " + getFulfillOrderRequest().getOrderId());
 }
 

完成 FulfillChocoDinoOrder

移动活动并将它们连接起来,如以下关系图所示。

为适当的 Staff 交互配置 FulfillChocoDinoOrder 流程。选择顶部的 FulfillChocoDinoOrder 节点。 选择 Staff 选项卡。选择每个节点并将 verb 更改为 Everybody

通过 Ctrl-S 保存更改。

对于父 ProcessChocoDinoOrder 业务流程,重复相同的 Staff 步骤。


图 52. 完成的 FulfillChocoDinoOrder
FulfillChocoDinoOrder




回页首


测试 ProcessChocoDinoOrder 流程

构建项目并开始测试

生成 FulfillChocoDinoOrder.bpelProcessChocoDinoOrder.bpel 的部署代码。

创建表和数据源。

发布并启动 TestServer。

使用 Business Process Web Client 测试 ProcessChocoDinoOrder 业务流程。此业务流程有一个 staff 活动。 在 Servers 视图中,右键单击 TestServer 并选择 Launch Business Process Web Client

单击 Web Client 左栏中的 My Templates。其中应该列出了流程 FulfillChocoDinoOrder 和 ProcessChocoDinoOrder,并有一个 Running 状态图标 Running Process

单击 ProcessChocoDinoOrder Template Name。系统将显示模板定义以供您检查。 其中列出了您实现的 processOrder 服务。


图 53. processOrder 服务
显示 processOrder 服务以供您检查

输入测试数据

单击 processOrder 链接。显示 Process Input Message 面板。 输入 Test3。 Betsy's Sweet Shop(客户 ID 1000-01)订购 100 个 Braciosaurs Brownie(项目 ID 400)。选择 orderId 为 2

Process Input Message
customerId 1000-01
itemId 400
orderId 2
数量 100

单击 启动实例。 Process Instance 将执行。

构建项目并开始测试

在左栏中选择 My To Dos 链接。这将列出任何 staff 活动。


图 54. processOrder 服务
显示 processOrder 的任何 Staff 活动。

单击 RetrieveItems 链接。


图 55. 处于 Ready 状态的 RetrieveItem
处于 Ready 状态的 RetrieveItem

由于您需要完成此订购,所以单击 Claim。这样将返回到 My To Dos


图 56. 处于 Claimed 状态的 RetrieveItem
处于 Claimed 状态的 RetrieveItem

完成 Staff 活动

单击 RetrieveItems 链接。您将看到以下内容。在 isFulfilled 中输入 true,在 quantityFilled 中输入 100。单击 完成


图 57. 输入数据然后完成
输入数据然后完成。

测试结果

选择 Web Client 的左栏中的 Created By Me 链接。单击 Test3 流程链接。将 isComplete 的 Response 值设置为 true。将注释设置为 ChocoDino order completed by Kwesi


图 58. Test3 的执行结果
isComplete 设置为 true。注释设置为 ChocoDino order completed by Kwesi。

执行几次测试,其中包括 quantityFilled 小于请求数量的一次测试。此订购应该不能完成。

关闭 Web Client。在 Servers 视图中右键单击 TestServer。选择 Stop

结束语

美味!巧克力三角恐龙

如果您进行到本文这里,则已经构建了两个业务流程:ProcessChocoDinoOrder 和 FulfillChocoDinoOrder。第一个流程使用一个连续的关系图。第二个流程用一个流关系图实现。两个流程都包含基本的 BPEL4WS 活动。另外,您还使用了 IBM 扩展 Staff 和 Java Snippet。现在,Kwesi 准备使用您的订购流程来帮助他销售 ChocoDino's 美味恐龙巧克力。



参考资料



作者简介

Fred Simmons 是 IBM Software Services for WebSphere 的一名顾问,在位于北卡罗莱纳州 Research Triangle Park 工作。您可以通过 fredsid@us.ibm.com 与 Fred 联系。


Jeng Yoong Tan 是的 IBM Software Services for WebSphere 的一名顾问,在位于北卡罗莱纳州 Research Triangle Park 工作。Jeng 经常与他的儿子 Nicholas Tan 一起玩各种恐龙游戏。您可以通过 jtan@us.ibm.com 与 Jeng 联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款