`

开始在 WebSphere Studio 中使用 BPEL4WS(无调用JAVA服务)

阅读更多
级别: 中级

Jane Fung, 软件开发人员,WebSphere Studio Application Developer Integration Edition, IBM 多伦多实验室
Colin Yu, 技术设计人员,业务场景, IBM 多伦多实验室

2004 年 8 月

    本教程讲述了在 WebSphere Studio Application Developer Integration Edition V5.1 中如何使用 Web 服务的业务流程执行语言(Business Process Execution Language,BPEL4WS)来创建和部署业务流程。通过不同的例子,您可以学习 BPEL 规范中的不同组件。

引言
在 WebSphere 上下文中,业务流程是一组编排好的活动,这组活动集中描述了实际的业务操作。在内部结构中,使用 Web 服务描述语言 (WSDL) 定义每个活动,使用 Web 服务的业务流程执行语言 (BPEL4WS) 或者流描述标识语言(FDML) 定义活动之间的交互。

WebSphere Studio Application Developer Integration Edition V5.1 (以下简称 Application Developer)支持使用 BPEL4WS 进行业务流程的开发。BPEL 规范是由 IBM、Microsoft® 和 BEA 共同开发的。它为创建业务流程提供了一个 XML 大纲。IBM 扩展了 BPEL 规范,包括一些有用的组件,例如 JavaSnippet 和 Staff 活动。扩展版本名为 BPEL+。

Application Developer 同时支持 BPEL 和 BPEL+ 规范。它为组装业务流程提供了一个图形化的编辑器和一个单元测试环境,可以在这个环境中执行和调试流程。这些工具提供了为构建部署到 WebSphere Integration Test Server 上的业务流程所需要的一切支持。

本文的其余部分组织如下:

    * BPEL 是什么?通过举一个业务流程的例子概述了 BPEL 中的组件。
    * 创建一个简单的 BPEL 流程描述了创建一个业务流程的步骤。
    * 调用 Java 服务将 Java™ 服务引入到业务流程中。
    * 调用另一个业务流程描述如何在一个业务流程里调用另一个业务流程。

BPEL 是什么?
下面是在 Application Developer 中用 BPEL 描述的一个业务流程示例:

图 1.Application Developer 中的示例 BPEL 文件
示例 BPEL 文件

图 1 详细解释了许多活动节点:

Receive
    BPEL 流程至少要有一个 Receive 节点,负责接收输入的信息。
Reply
    BPEL 流程可以有一个 Reply 节点,这取决于该流程是否需要提供一个应答。
Empty
    Empty 节点其实是一个占位符,它什么都不做。
JavaSnippet
    JavaSnippet 节点允许用户编写 Java 代码。正如前面提到的,这个活动只存在于 BPEL+ 规范中。
Sequence
    Sequence 节点内的元素会按顺序执行。例如,JavaSnippet 节点在 Empty1 之后执行。
Flow
    包括 Sequence1 和 Sequence2 的两道蓝条就是 Flow 节点。Flow 节点内的项是并行执行的。例如,Sequence1 和 Sequence2 同时开始执行。

业务流程有一个用 WSDL 描述的服务定义,该服务定义是一个标准的 XML 格式通讯协议。它将服务定义为网络端点或端口的集合。WSDL 也是 Web 服务的标准通讯协议。

WSDL 定义包括端口类型、操作和消息类型的定义。端口类型描述了业务流程支持的操作。每个操作都有定义好的输入消息和/或输出消息。如果一定要用 Java 术语来理解的话,一个操作类似于 Java 中的一个方法。输入消息类似于方法的输入参数。输出消息可以看作是方法的返回类型。

下面是 BPEL 创建向导创建的一个默认的服务定义:


<?xml version="1.0" encoding="UTF-8"?>
<definitions targetNamespace="http://www.example.com/process50233470/interface/"
      xmlns="http://schemas.xmlsoap.org/wsdl/"
      xmlns:tns="http://www.example.com/process50233470/interface/"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema/"
      xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/">
  <message name="InputMessage">
    <part name="contents" type="xsd:string"/>
  </message>
  <portType name="ProcessPortType">
    <operation name="InputOperation">
      <input name="Input" message="tns:InputMessage"/>
      <output name="Output" message="tns:InputMessage"/>
    </operation>
  </portType>
</definitions>

通过 WSDL 服务定义,业务流程可以被任何充当服务客户端的应用程序所调用。例如,一个 BPEL 流程可以被另一个 BPEL 流程调用。

创建一个简单的 BPEL 流程
在本部分中,将创建、部署并运行一个简单的 BPEL 服务。

步骤 1.创建服务项目
创建一个服务项目,命名为 SimpleServiceProject 。

   1. 在 Business Integration 透视图中,选择 File =>New =>Service Project。
   2. 输入 SimpleServiceProject 作为项目名称,然后单击 Finish。

步骤 2.使用 WSDL 创建服务定义
正如上面所提到的,每个 BPEL 流程需要一个 WSDL 定义,这样端口类型和操作可以供外部调用。

   1. 在 Business Integration 透视图的 Services 视图中,展开 Service Projects,右键单击 SimpleServiceProject并选择 New =>Empty Service。
   2. 输入 validatorprocess 作为 Package的名称。
   3. 输入 MailValidator 作为 File name。单击 Finish。
   4. 切换到 MailValidator.wsdl 编辑器的 Graph 视图。
   5. 在 Port Types栏内单击右键,选择 Add Child =>Port Type。输入 MailValidatorPortType 作为 name,然后单击 OK。
   6. 右键单击 MailValidatorPortType选择 Add Child =>operation,输入 ValidateOperation 作为 name,然后单击 OK。
   7. 右键单击 ValidateOperation选择 Add Child =>Input。
   8. 右键单击 Input选择 Set Message。用默认值创建一个新的 WSDL 消息,然后单击 Finish。
   9. 在 Messages 栏中,右键单击 ValidateOperationRequest,选择 Add Child =>Part。输入 SenderAddress 作为 part 的 name。单击 OK。注意到消息部分缺省的有一个 xsd:string 类型,该类型是内置的 xsd 类型。
  10. 再添加一个 part。右键单击 ValidateOperationRequest选择 Add Child =>Part。输入 ReceiverAddress 作为 part 的 name。单击 OK。
  11. 在 Port Types 栏中,右键单击 ValidateOperation选择 Add Child =>Output。如果服务不同步,可以不需要输出。但是,如果服务同步,需要创建一个输出给调用者以返回一个响应。
  12. 右键单击 Output选择 Set Message。用默认值创建一个新的 WSDL 消息,然后单击 Finish。
  13. 在 Messages 栏中,右键单击 ValidateOperationRequest选择 Add Child =>Part。输入 MailToAddress 作为 part 的 name。单击 OK。
  14. 保存 WSDL 文件并关闭编辑器。

图 2.MailValidator.wsdl
MailValidator.wsdl

步骤 3.创建 BPEL 流程
BPEL 流程可以是基于序列(sequence-based)的或是基于流(flow-based)的。在本步骤中,将创建一个基于序列的流程。在基于序列的 BPEL 流程中,所有的项都封装在一个序列中。另一方面,在基于流的流程中所有的项都封装在一个流中。

   1. 在 Business Integration 透视图的 Services 视图中,展开 Service Projects,右键单击 SimpleServiceProject选择 New =>Business Process。
   2. 输入 validatorprocess 作为 package 的名称, MailValidatorProcess 作为 File name。然后单击 Next。
   3. 选择 Sequence-based BPEL Process。单击 Finish。

业务流程创建向导为新创建的 BPEL 流程创建了一个默认的 WSDL 服务定义。默认的服务定义已经定义了一些虚构的端口类型、操作和消息。但是,用户可能不会使用默认的服务定义,而使用步骤 2 中定义的 WSDL 服务定义。因此,需要清除 BPEL 流程和默认的 WSDL 文件。

   1. 在 MailValidatorProcess.bpel 编辑器中,右键单击 InputVariable=> Delete。
   2. 右键单击 PartnerLink=> Delete。
   3. 在编辑器中打开 MailValidatorProcesInterface.wsdl ,右键单击 ProcessPortType=> Delete。
   4. 右键单击 InputMessage=> Delete。
   5. 保存 WSDL 和 BPEL 文件并关闭 WSDL 文件。

步骤 4.为 BPEL 流程创建合作伙伴链接
BPEL 一个重要的用途是通过 Web 服务接口与其他服务互操作的能力。与 BPEL 流程互操作的其他服务称为合作伙伴。BPEL 流程调用合作伙伴之前,需要先定义一个合作伙伴链接来引用合作伙伴的 WSDL 接口。而且,每个 BPEL 流程需要定义一个指向它自己的 WSDL 接口的合作伙伴链接,该链接自描述的。因此,每个 BPEL 流程至少要有一个描述它自己的合作伙伴链接。如果流程调用其他服务,每个服务都需要一个合作伙伴链接定义。

为 BPEL 流程创建一个自描述的合作伙伴链接。

   1. 在 MailValidatorProcess.bpel 编辑器中,单击 Plus图标创建一个新 PartnerLink。
   2. 输入 MyProcess 作为 Partnerlink 的名称。单击 Enter。
   3. 在编辑器的详细信息区域中,转到 Implementation页。单击 New PartnerLink Type。PartnerLink Type 定义服务的角色和端口类型。
   4. 输入 MyRole 作为 First role的名称。
   5. 单击 Browse选择一个端口类型文件。选择 SimpleServiceProject => validatorprocess => MailValidator.wsdl => MailValidatorPortType。这是步骤 2 中定义的端口类型。单击 OK。
   6. 单击 <--> 按钮,将 MyRole 移到右侧。左侧是流程调用的合作伙伴的角色。右侧是自描述的伙伴链接的角色。保存 BPEL 流程。

图 3. Mail Validator 合作伙伴链接
Mail Validator 合作伙伴链接

步骤 5.创建变量
BPEL 变量可以是 WSDL 消息类型或 XSD 元素类型。可以使用编辑器创建 WSDL 消息类型变量。WSDAIE v5.1 中的变量都是全局变量。但是,Application Developer 的以后版本中可能会引进局部变量。

为输入和输出消息创建变量。

   1. 在 MailValidatorProcess.bpel 编辑器中,单击 Plus 图标创建新变量。输入 ValidateOperationRequest 作为变量名。
   2. 转到详细信息区域的 Message 页。单击 Browse=>展开 SimpleServiceProject => 展开 validatorprocess=> MailValidator.wsdl=>选择 ValidateOperationRequest。单击 OK。
   3. 添加另一个变量,命名为 ValidateOperationResponse 。
   4. 单击 Browse=>展开 SimpleServiceProject => 展开 validatorprocess=> MailValidator.wsdl=>选择 ValidateOperationResponse。单击 OK。
   5. 保存 BPEL 文件。

步骤 6.修改接收节点和应答节点
BPEL 流程通过接收节点从客户端接收输入消息时,会创建新的 BPEL 流程实例,BPEL 流程开始执行。应答节点会发送一个输出消息返回给客户端。正如前面所提到的,这个流程是同步的,因此它既有接收节点又有应答节点。用户需要在接收节点和应答节点内指定端口类型、操作和消息。实际上,BPEL 流程允许多个接收和应答节点,但这是与相关性集合(correlation set)有关的高级主题,不在本教程讨论的范围之内。

   1. 选择 Receive节点,转到详细信息栏中的 Implementation 页。选择 MyProcess作为 Partner Link。
   2. 选择 ValidateOperationRequest作为 Request。
   3. 确保 Create a new Process instance if one does not already exist复选框被选中。
   4. 选择 Reply节点。转到详细信息栏中的 Implementation 页。选择 MyProcess作为 Partner Link。
   5. 选择 ValidateOperationResponse作为 Response。
   6. 保存 BPEL 文件。BPEL 流程上不会再有红色的十字形标记。

图 4.修改接收节点和应答节点
修改接收节点和应答节点

步骤 7.完成 BPEL 流程
可以使用位于编辑器左边的图标菜单项给 BPEL 流程添加基本节点。或者,也可以使用上下文菜单添加新节点。

本部分中创建的 BPEL 流程用来验证邮件地址。如果来自 ValidateOperationRequest 的 ReceiverAddress 中包括 “Toronto” 或 “Markham” 等词,BPEL 流程会将 ValidateOperationResponse 中的 MailToAddress 设置为 ReceiverAddress。否则,该邮件会返回给发送人并且 MailToAddress 会设置为 SenderAddress。

   1. 在接收节点后添加一个转换节点。右键单击 Reply节点,选择 Insert Before =>Switch。或者在第三级图标菜单里找到转换节点,然后简单的将其拖放到接收节点后面。图 5 显示了图标菜单的位置。
   2. 右键单击 Switch,选择 Add Case。
   3. 再添加一个实例。右键单击 Switch,选择 Add Case。
   4. 右键单击 Switch,选择 Add Otherwise。

图 5.编辑器的图标菜单
编辑器的图标菜单

为第一个实例输入 Visual Expression。

   1. 单击第一个实例节点,转到 Condition 页。为该实例输入一个 Java 表达式或 Visual 表达式。在下拉框中选择 Visual Expression。
   2. 可以通过右侧栏中列出的变量访问消息的内容。单击蓝色的 Condition链接 =>展开 ValidateOperationRequest=>选择 ReceiverAddress。
   3. 选择 Method or Field。
   4. 选择 indexOf(ch...)。
   5. 在右侧的栏中,单击蓝色的 ch...链接,然后单击 String。输入 Toronto 。
   6. 将光标置于闭括号的后面。在右侧的栏上选择 >。
   7. 选择 Number。输入 -1 。保存 BPEL 文件。
   8. 最终的 Visual Expression 就是这样的。如果 ReceiverAddress 中包含 “Toronto”,表达式返回 true。

图 6.实例 1 中的 Visual Expression
实例1中的 Visual Expression

为第二个实例输入 Java 表达式。

   1. 单击第二个实例节点转到 Condition 页。在下拉框中选择 Expression。
   2. 在编辑器中输入下面的代码片段:


String receiverAddr = getValidateOperationRequest().getReceiverAddress();
if (receiverAddr.indexOf("Markham")>-1) {
  return true;
}
return false;

   3. 如果发送人地址中包含 Markham 这个词,上面的代码片段将返回 true。保存 BPEL 文件。

为第一个实例添加 JavaSnippet 节点。

   1. 右键单击第一个 Case,选择 Add =>Java Snippet。Java Snippet 允许用户输入 Java 代码。这遵从的不是标准的 BPEL 规范,而是 IBM BPEL+ 规范。
   2. 单击 JavaSnippet 转到 implementation 页:


// Set the MailToAddress in the response to the ReceiverAddress from Request
String receiverAddr = getValidateOperationRequest().getReceiverAddress();
ValidateOperationResponseMessage msg = getValidateOperationResponse();
msg.setMailToAddress(receiverAddr);
setValidateOperationResponse(msg);

   3. 如果出现编译错误,在编辑器内单击右键并选择 Source =>Organize Imports。系统会自动判断是否需要导入其他文件来解决编译错误的问题。
   4. 这段代码片段会将请求中的 ReceiverAddress 复制到应答中的 MailToAddress。保存 BPEL 文件。

为第二个实例添加一个 Assign节点。在第一个实例中,Java Snippet 节点用于在变量之间复制值。这不是唯一的方法,也可以用赋值节点来实现这个功能。

   1. 右键单击第二个 Case,选择 Add =>Assign。
   2. 单击 Assign转到 implementation 页。在 From下拉框中选择 Variable or Part。
   3. 展开 ValidateOperationRequest直到看见 ReceiverAddress。选择 ReceiverAddress。
   4. 在 To下拉框中选择 Variable or Part。
   5. 从 ValidateOperationResponse中选择 MailToAddress。将请求中的 ReceiverAddress 复制到应答中的 MailToAddress。

图 7. 赋值节点的执行
赋值节点的执行

给其他的节点添加赋值节点。

   1. 右键单击第二个 Case,选择 Add =>Assign。
   2. 单击 Assign转到 implementation 页。在 From下拉框中选择 Variable or Part。
   3. 从 ValidateOperationRequest中选择 SenderAddress。
   4. 在 To下拉框中选择 Variable or Part。
   5. 从 ValidateOperationResponse中选择 MailToAddress。

在应答节点前添加一个 JavaSnippet 节点。该 JavaSnippet 节点将仅仅打印系统输出。

   1. 右键单击 Reply,选择 Insert Before =>Java Snippet。
   2. 在编辑器中输入下面的代码片段。保存 BPEL 文件。


String receiverAddress = getValidateOperationRequest().getReceiverAddress();
String senderAddress = getValidateOperationRequest().getSenderAddress();
String mailtoAddress = getValidateOperationResponse().getMailToAddress();

System.out.println ("Receiver Address: " + receiverAddress);
System.out.println ("Sender Address: " + senderAddress);
System.out.println ("Mail To Address: " + mailtoAddress);

BPEL 流程创建完成。下一步是生成部署代码并在服务器上进行测试。

图 8.MailValidator.bpel 完结版本
MailValidator.bpel 完结版本

步骤 9.生成部署代码
要在 WebSphere Integration Test Server 中运行 BPEL 流程,必须生成部署代码。本步骤将为 BPEL 流程创建 EAR 和 EJB,他们可以部署到测试服务器上。

   1. 在 Services 视图中,右键单击 MailValidatorProcess.bpel选择 Enterprise Services =>Generate Deploy Code。
   2. 接受所有的默认设置,然后单击 OK。生成代码之后,可以看见创建了三个项目:SimpleServiceProjectEAR、 SimpleServiceProjectEJB 和 SimpleServiceProjectWeb。

步骤 10.部署到测试服务器
创建一个名为 IT Server 的整体测试环境服务器。

   1. 在 Servers 视图中,单击右键并选择 New =>Server and Server Configuration。
   2. 选择 WebSphere version 5.1 =>Integration Test Environment。
   3. 输入 IT Server 作为 server name。单击 Finish。
   4. 将 EAR 项目添加到服务器上。右键单击 IT Server,选择 Add and remove projects。
   5. 单击 Add All。单击 Finish。
   6. 启动服务器。右键单击 IT Server,选择 Start。

步骤 11.运行 BPEL 流程

   1. 启动服务器后,打开 BPE Web 客户端。可以通过服务器上的上下文菜单打开。右键单击 IT Server,选择 Launch Business Process Web Client。或者,在 Web 浏览器中输入 http://localhost:9080/bpe/webclient。
   2. 单击 My Templates。
   3. 选择 MailValidatorProcess =>Start Instance。
   4. 输入 123 Queen St., Toronto 作为 ReceiverAddress。
   5. 输入 8200 Warden Ave., Markham 作为 SenderAddress。
   6. 单击 Start Instance创建一个 BPEL 流程的新实例。
   7. 从控制台上可以看见, MailToAddress 被设置为 123 Queen St., Toronto ,这是因为 ReceiverAddress 中包含 Toronto :


Receiver Address: 123 Queen St., Toronto
Sender Address: 8200 Warden Ave., Markham
Mail To Address: 123 Queen St., Toronto

   8. 再运行一次。输入 123 Queen St., North York 作为 ReceiverAddress。流程认为该接收地址是无效的,因此, MailToAddress 被设置为 8200 Warden Ave., Markham 。


Receiver Address: 123 Queen St., North York
Sender Address: 8200 Warden Ave., Markham
Mail To Address: 8200 Warden Ave., Markham

本部分创建了一个简单的 BPEL 流程。在下一部分中,将创建一个长期运行的 BPEL 流程,该流程调用 Java Web 服务和另一个 BPEL 流程。[img][/img]
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics