使用 Eclipse BPEL 插件开发和执行 WS-BPEL V2.0 业务流程

摘自: IBM developerWorks China  被阅读次数: 218


yangyi 于 2008-05-11 22:27:26 提供


2008 年 5 月 06 日

BPEL V2.0 是一种功能强大的语言,可用于帮助开发由大量其他组件和 Web 服务组成的大型复杂应用程序。BPEL 允许您使用图形编辑器来描述长期运行的工作流程,从而在人类友好的图表上展现工作流程。本文将介绍如何使用 Eclipse BPEL 插件开发流程并与 Apache ODE 结合使用来执行流程。
WS-BPEL 是什么?

WS-BPEL 是由 OASIS 开发的供应商中立的规范,它将把业务流程指定为 Web 服务之间的一套互动操作。OASIS 将把 WS-BPEL 定义为如下内容:“可以通过两种方法描述业务流程。可执行业务流程将为业务互动中的参与者的实际行为建模。抽象业务流程都是部分指定的流程,不适于执行。抽象流程可以隐藏一些必需的具体操作信息。抽象流程充当描述角色,具有多个可能的用例,包括可观测行为以及流程模板。WS-BPEL 的意图是为可执行流程和抽象流程的行为建模。

“WS-BPEL 为可执行业务流程和抽象业务流程的规范提供了一种语言。通过这样做,它将扩展 Web 服务互动模型并使它可以支持业务事务。WS-BPEL 将定义一个可互操作的综合模型,该模型应当有助于在企业内空间和 B2B 空间中扩展自动化流程整合。”

Apache Foundation 把它的 Web 服务业务流程执行语言(Web Services Business Process Execution Language,WS-BPEL)V2.0 实现称为 Orchestration Director Engine (ODE)。ODE 将执行 WS-BPEL 流程,这些流程能够与 Web 服务进行通信、发送和接收消息等。Eclipse BPEL 项目是一个相关的开源项目,该项目将为 WS-BPEL V2.0 流程的可视化开发提供一个 Eclipse 插件(如果您还不了解这项技术,请参阅 “WS-BPEL 是什么”)。

撰写本文时,ODE V1.1 和 Eclipse BPEL 项目里程碑 M3 是最新版本。本文将检验这些产品并介绍如何使用 Apache ODE 和 Eclipse BPEL 项目创建您自己的 BPEL 流程并将其集成到应用程序中。

如果您更为熟悉 BPMN,则可能需要查看由 Tyler Anderson 撰写并发表在 developerWorks 中的文章 “用 Eclipse 执行业务流程”,要处理业务流程,还需要查看使用 Eclipse STP BPMN Modeler 的教程(请查阅 参考资料)。

软件安装

您的操作系统可以是近期版本的 Microsoft® Windows®、Linux® 或 Mac OS X。本文是使用 Linux 撰写的,因此您可能需要根据操作系统的风格调整文件位置。在为 Eclipse 安装 ODE 和 BPEL 之前,确保您的计算机已经安装了下列软件:

  1. Java™ V5.0 或更高版本
  2. Tomcat V5.5 或更高版本
  3. 安装了以下插件的 Eclipse V3.3.x:
    • EMF V2.3.x
    • GEF V3.3.x
    • DTP STK V1.5.x
    • WTP (Web Tools Platform) V2.0.x

请参考各个应用程序的安装指南进行安装(请参阅 参考资料)。

Apache ODE 安装

下载 ODE。启动 Apache Tomcat Web 容器并使用 Tomcat Manager(应当会在您的计算机中的 http://localhost:8080/manager/html 找到)部署发行版归档中的 ode.war 模块。要检查是否成功,请访问 http://localhost:8080/ode/,该地址将显示您计算机的 ODE Web 服务的状态。

Eclipse 的 BPEL 支持

要安装 Eclipse BPEL 项目,请运行 Eclipse 应用程序,启动 Eclipse 更新管理器(通过单击菜单 Help > Software Update > Find & Install)并选择 New feature 来安装选项。单击 New Remote Site... 并把 URL http://download.eclipse.org/technology/bpel/update-site/ 添加到 New Update Site 对话框中,然后把站点命名为 BPEL。单击 Finish,选择最近的镜像,选择 BPEL Designer for Eclipse,同意许可证条款,单击 Select All 选项,然后单击 NextFinish。Eclipse 将提醒所有潜在的复制冲突,然后警告 BPEL 正被取消签名。如果提供者是 Eclipse.org,单击 Install。安装完成时,Eclipse 将询问您是否重新启动计算机。





回页首


创建一个简单的 BPEL 流程

在此部分中,我们将创建一个简单的 BPEL 流程并尝试在 ODE 中运行它。此流程仅执行简单的字符串处理。记住,它只是一个简单示例,而且您可以使用 WS-BPEL V2.0 规范创建更加复杂的流程。

Eclipse BPEL 编辑器

要创建一个简单的 BPEL 流程,请运行 Eclipse 并单击 File > New > Other 菜单项,选择 BPEL 2.0 -> BPEL Project 选项并创建一个名为 HelloWorld 的新 BPEL 项目。创建了项目后,您就可以创建第一个 BPEL 流程了。再次单击 File > New > Other 菜单项并选择 BPEL 2.0 > New BPEL Process File 选项来启动 BPEL 流程创建向导。


图 1. 创建 BPEL 流程文件
创建 BPEL 流程文件

让我们创建一个同样名为 HelloWorld 的同步流程。在向导的下一页中,您应当选择 BPEL 流程文件位置 —— 只需选择先前创建的项目并单击 Finish。系统将创建样例流程。


图 2. 创建一个同步流程
创建一个同步流程

如示,新建流程有两个内部 BPEL 变量 —— inputoutput —— 以及带有一个接收元素和一个应答元素的序列。接收块负责接收输入的 BPEL 流程数据和变量输入的初始化。类似地,应答块旨在使用输出变量输出 BPEL 流程数据。

同样在创建 BPEL 流程期间,向导创建了一个 WSDL 文件。此文件将描述输入和输出数据类型以及表示 BPEL 流程的端口类型。输入和输出数据类型都只包含单个字符串字段。

我们已经准备好把一些数据处理添加到流程中。为此,请在 receiveInput 块和 replyOutput 块之间拖放一个 Assign 块。


图 3. 拖放 Assign 块
拖放 Assign 块

在放置了赋值块后,右键单击 Assign 块并选择 Show In Properties 上下文菜单项以显示 Properties 视图并选择 Details 选项卡。Assign 块应当会用一个初始的 XML 标记结构来初始化输出变量。它是大多数 BPEL 处理引擎必需的常用程序。单击 Detail 选项卡中的 New 按钮以开始创建第一个赋值程序。在 From 选择框中选择 Fixed Value 元素并在文本区域中输入下列行:

>tns:HelloWorldResponse xmlns:tns="http://www.ibm.com/wd2/ode/HelloWorld">
     >tns:result/>
     >/tns:HelloWorldResponse>

接下来,在 To 选择框中选择 Variable 元素并在变量树中选择 output/payload 变量,如下所示:


图 4. 初始化输出变量
初始化输出变量

在初始化了输出变量后,我们可以创建一个新的赋值程序。对于样例流程,此程序将从输入变量中获取一个字符串值,把它与 “Hello” 问候语连接起来并把结果赋给输出变量字符串字段。为此,单击 New 按钮并在 From 选择框中选择 Expression 值。在下面显示的文本框中,输入以下表达式:concat("Hello ", $input.payload/tns:input)。在 To 部分中,选择 output/payload/tns:result 变量,如下所示:


图 5. 选择 output/payload/tns:result
选择 output/payload/tns:result

Assign 块已经就绪。正如您所见,Eclipse BPEL 插件将提供 XPath V1.0 突出显示功能和代码完成功能来简化 XPath 查询的创建操作(要了解关于 XPath 的更多信息,请参阅 参考资料)。

WSDL 文件更改

BPEL 流程的 WSDL 文件应当描述 BPEL 流程中使用的类型以及端口类型、绑定和流程的服务。由向导自动创建的 WSDL 已经包含一个端口类型,而且为了使流程可以运行,我们需要为它创建绑定和服务。

在单独的编辑器中打开 WSDL 文件并查看端口类型图形化定义。


图 6. 查看端口类型图形化定义
查看端口类型图形化定义

要创建 Web 服务绑定,请右键单击 WSDL 编辑器中的任意空白区域并选择 Add Binding 选项。在 Properties 视图中,把新建绑定重命名为 HelloWorldBinding 并选择 HelloWorld 作为新绑定的端口类型。单击 Generate Binding Content 按钮将显示 Binding Wizard 对话框。


图 7. Binding Wizard 对话框
Binding Wizard 对话框

Protocol 选择框中选择 SOAP 协议,在 SOAP Binding Options 部分中选中 document-literal 选项并单击 Finish


图 8. 绑定选项
绑定选项

创建了绑定后,右键单击 WSDL 编辑器中的空白区域并选择 Add Service 菜单项来创建一个名为 HelloWorldService 的新绑定。然后把 HelloWorldPort 指定为绑定的端口名称并把 URL http://localhost:8080/ode/processes/HelloWorld 指定为绑定的地址。同时选择 HelloWorldBinding 作为新建服务的绑定。


图 9. HelloWorldBinding
HelloWorldBinding

WSDL 文件已经准备好被部署到 ODE 应用程序中。

部署描述符

在准备好部署流程之前需要做的最后一件事是创建 ODE 描述符。描述符必须名为 deploy.xml 且必须放在存储 BPEL 和 WSDL 文件的目录中。只需创建一个新的 deploy.xml 文本文件并把以下内容放置在该文件中。


清单 1. 创建 deploy.xml 文本文件
                
>?xml version="1.0" encoding="UTF-8"?>
>deploy xmlns="http://ode.fivesight.com/schemas/2006/06/27/dd"
    xmlns:pns="http://www.ibm.com/wd2/ode/HelloWorld" 
    xmlns:wns="http://www.ibm.com/wd2/ode/HelloWorld">
  >process name="pns:HelloWorld">
    >active>true>/active>
    >provide partnerLink="client">
      >service name="wns:HelloWorldService" port="HelloWorldPort"/>
    >/provide>
  >/process>
  >/deploy>

描述符将为可部署单元指定流程和服务列表。





回页首


使用 BPEL 流程

现在,当 HelloWorld BPEL 流程就绪时,我们可以把它部署到 ODE 应用程序中并测试该流程。

把 BPEL 流程部署到 ODE 中

ODE 支持热部署 BPEL 流程。要部署在先前部分中创建的流程,只需把包含流程的所有文件的文件夹复制到部署了 ODE 的 Apache Tomcat 的 webapps/ode/WEB-INF/processes 目录中。要监视部署流程,可以查看 Tomcat 根目录中的日志文件 logs/catalina.out,查找所有新输入。

测试已部署流程的一种简单方法是使用 Eclipse Web Services Explorer 工具。右键单击 HelloWorld WSDL 文件并选择 Web Services > Test with Web Services Explorer 弹出式菜单项。Eclipse 将启动 Web Services Explorer 测试工具。使用此工具,把一些文本输入到输入参数中并调用 Process 操作。如图 10 所示,Web 服务将向您刚输入的文本返回问候语。


图 10. 调用 WSDL 操作
调用 WSDL 操作

创建 BPEL 流程客户机

在拥有了执行 BPEL 流程的 Web 服务后,我们可以把此流程集成到客户机应用程序中。让我们使用 Eclipse WTP 插件来生成基于 Axis 的 Web 服务客户机。在生成客户机代码之前,需要把 Tomcat 服务器添加到 Eclipse 服务器的列表中。单击 File > New > Other 菜单项并从列表中选择 Server 选项。然后,执行向导步骤来为 Eclipse 工作空间创建新 Tomcat 服务器。

在创建了服务器后,右键单击 WSDL 文件并选择 Web Services > Generate Client 弹出式菜单项。此操作将启动 Web Service Client 向导,该向导将生成一个新项目,提供了处理 Web 服务所需的类。


图 11. 设置 Web 服务客户机
设置 Web 服务客户机

要使用生成的文件,请使用类似如下所示的代码:


清单 2. 创建 Web 服务客户机
                
HelloWorldServiceLocator locator = new HelloWorldServiceLocator();
HelloWorldRequest hwRequest = new HelloWorldRequest();
hwRequest.setInput("developerWorks!");
				
HelloWorldResponse hwResponse = locator.getHelloWorldPort().process(hwRequest);
String output = hwResponse.getResult();

在执行了代码后,输出变量应当包含 BPEL 流程工作的结果。





回页首


ODE 管理 API

ODE 通过 Web 服务提供对一些应用程序管理功能的访问。通过使用 ODE,您可以控制部署到 ODE 中的流程及其实例,这些实例目前是在服务器中执行的。所有操作都是在位于 Tomcat 应用程序的文件夹 webapps/ode/WEB-INF 中的 pmapi.wsdl 文件中描述的。不幸的是,pmapi.wsdl 将使用旧 RPC 文档样式,并且,很难通过 Eclipse Web Services Explorer 测试工具使用它。

访问管理 API 的最佳方式是使用 Axis2 库。特别是使用 ServiceClientUtil 类,该类是由 ode-axis2 库提供的。Axis2 将依赖于其他库,包括 Xerces、Stax 等。ode.war 归档中附带了大多数库,因此可以将其添加到项目依赖关系中。

以下代码将演示如何提取当前流程实例的信息。


清单 3. 提取当前流程实例的信息
                
ServiceClientUtil client = new ServiceClientUtil();
OMElement msg = client.
  buildMessage("listAllInstances", new String[] {}, new String[] {});
OMElement result = 
  client.send(msg, "http://localhost:8080/ode/processes/InstanceManagement");
			
List>ProcessInfo> processes = new ArrayList>ProcessInfo>();
Iterator>OMElement> i = result.getChildElements();
			
while (i.hasNext()) {
  OMElement omInstanceInfo = i.next();
  OMElement omProcessName = 
    omInstanceInfo.getFirstChildWithName(
      new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",
						"process-name"));
  OMElement omStatus = 
    omInstanceInfo.getFirstChildWithName(
      new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",
				"status"));
  OMElement omStarted = 
    omInstanceInfo.getFirstChildWithName(
      new  QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",
				"dt-started"));
  OMElement omLastActive =
    omInstanceInfo.getFirstChildWithName(
      new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",
				"dt-last-active"));

  ProcessInfo process = new ProcessInfo();
  process.setProcessName(omProcessName.getText());
  process.setStatus(omStatus.getText());
  process.setStarted(omStarted.getText());
  process.setLastActive(omLastActive.getText());
  processes.add(process);
  }

示例将使用 axiom 库来检索信息并把它存储为 ProcessInfo 对象列表。可以从应用程序的任何其他部分使用这些对象。





回页首


ODE 事件侦听程序

ODE 允许您为 ODE 应用程序内的任何操作(例如启动和停止流程实例)开发侦听程序。要创建您自己的事件侦听程序,需要实现 ode-bpel-api.jar 库中定义的 org.apache.ode.bpel.iapi.BpelEventListener 接口。以下代码将演示一个输出到标准输出流传入事件的简单实现和 startup()shutdown() 侦听程序方法的调用。


清单 4. startup()shutdown() 侦听程序方法
                
/**
* {@inheritDoc}
*/
public void onEvent(BpelEvent event) {
  System.out.println(event);
}
	
/**
* {@inheritDoc}
*/
public void startup(Properties arg0) {
  System.out.println(this.getClass() + " startup");
}
	
/**
* {@inheritDoc}
*/
public void shutdown() {
  System.out.println(this.getClass() + " shutdown");
  }

当侦听程序类就绪后,需要把它放到 ODE 类路径中(您可以把带有侦听程序类的 JAR 文件放入 webapps/ode/WEB-INF/lib Tomcat 目录)。您还需要创建 webapps/ode/WEB-INF/conf/ode-axis2.properties 属性文件并将下列行添加到其中:

ode-axis2.event.listeners=com.ibm.wd2.bpel.eventlistener.WD2EventListener

您的侦听程序类名称可以不同于上面的名称。





回页首


结束语

分享这篇文章……

digg 提交到 Digg
del.icio.us 发布到 del.icio.us
Slashdot Slashdot 一下!

BPEL V2.0 是一种功能强大的语言,可用于帮助开发由大量其他组件和 Web 服务组成的复杂应用程序。BPEL 允许使用图形编辑器来描述长期运行的工作流程,从而在人类友好的图表上展现工作流程。您可以使用开源产品创建使用 Apache 和 Eclipse 社区的 BPEL V2.0 规范的应用程序 —— 可以结合使用两者,Eclipse BPEL 项目用于开发流程,Apache ODE 用于执行。如上所述,两个产品至少可以在简单的 BPEL V2.0 流程上成功运行。但是,在真实业务应用程序中使用这些开源工具之前,建议先在一个更复杂的应用程序上研究这些开源工具的优缺点。



参考资料

学习

获得产品和技术

讨论
  • Eclipse Platform 新闻组 应当是讨论关于 Eclipse 的问题的第一站(选择此链接将启动默认的 Usenet 新闻阅读器应用程序并打开 eclipse.platform)。

  • Eclipse 新闻组 中有很多参考资料适用于对使用和扩展 Eclipse 感兴趣的人员。

  • 参与 developerWorks blog 并加入 developerWorks 社区。



作者简介

Ilya Platonov 是 Axmor Software 的软件工程师,在俄罗斯新西伯利亚 IBM Advanced Technology Solutions (ATS) Lab 提供咨询服务。他获得了新西伯利亚州大学的计算机科学硕士学位。最近一段时间,他以系统架构师和软件工程师的身份参与了至少 5 个 ATS 项目。


Artem Papkov 目前担任 IBM 的 Client Innovation Team 的解决方案架构师,辅助客户及业务伙伴在业务中采用新兴技术,比如 SOA 和 Web 服务。他于 1998 年毕业于 Belarusian State 大学的信息学和无线电电子学,获得计算机科学硕士学位。他于 2000 年加入位于北卡罗莱纳州的 IBM Research Triangle Park。他的工作经验包括利用新兴技术进行多层解决方案的软件开发、架构设计和基于 Internet 解决方案的集成。在过去三年中,他一直致力于紧密联系客户,帮助他们采用 Web 服务作为 IBM 策略集成技术,并采用 SOA 作为集成方法。


Jim Smith 具有超过 18 年的软件开发经验。他在加利福尼亚州利佛莫尔的 Sandia National Labs 开始了他的职业生涯,使用无数的现有遗留代码设计高速数据采集系统和分布式计算系统。凭着在 Java 语言和面向客户技术方面的扎实经验,Jim 转移到 Emerging Internet Technologies 团队,致力于为 IBM 客户实现 Java 解决方案。Jim 是 Advanced Technology Solutions (ATS) 的创始人和现任经理,ATS 是一个全球软件服务和开发组织,致力于为 IBM、开发实验室、业务合作伙伴和客户开发、提炼并特许经营高级技术和轻量级业务过程,从而实现标准技术和 IBM 产品的快速采用和部署。




原文链接: http://www.ibm.com/developerwork...