BPEL概念的理解

转载 2006年05月30日 17:57:00

BPEL4WS 的概念

BPEL4WS 支持两种截然不同的使用情形:

  • 实现可执行的业务流程。
  • 描述不可执行的抽象流程。

 

本文中着重阐述第一种情形;本系列以后将会有一篇文章来讨论 BPEL4WS 的一些抽象流程概念。

作为可执行流程的实现语言,BPEL4WS 的作用是将一组现有的服务整合起来,从而定义一个新的 Web 服务。因此,BPEL4WS 基本上是一种实现这样的整合的语言。与其它任何 Web 服务一样,整合服务的接口也被描述为 WSDL portType 的集合。整合(称为 流程)指明了服务接口与整合的总体执行的配合情况。 图 1说明了从外部看到的 BPEL4WS 流程的上述情况。


图 1. 作为 BPEL4WS 流程实现的 Web 服务的视图
作为 BPEL4WS 流程实现的 Web 服务的视图

BPEL4WS 中出现的整合原语主要来自于工作流和业务流程集成方面多年的经验,因此,BPEL4WS 的定位是成为一种业务流程整合语言。

实现服务

上图云块中的是什么东西?不同于用传统的编程语言来实现 WSDL 服务,每个 portType 的每项操作并不映射成 BPEL4WS 中的一个独立的逻辑块。服务的整个类型(即该服务的 portType 集合)由单个 BPEL4WS 流程实现。这样,与调用接口操作的外部用户相对应的特定“入口点”在 BPEL4WS 描述中指明。这些入口点消费 WSDL 操作的从只输入(input-only)操作或输入-输出(input-output)操作传入的消息。对于后一种情况,流程还必须指明输出消息在哪里生成。BPEL4WS 只使用和支持 WSDL 只输入操作和输入-输出(请求-响应(request-response))操作;只输出(output-only)(通知(notification))操作和输出-输入(output-input)(要求-响应(solicit-response))操作既不需要也不支持。

BPEL4WS 流程本身基本上就是一个流程图,类似于用来表达算法的流程图。流程的每一步称为一个活动。存在以下一些基本活动:调用某个 Web 服务上的操作( <invoke> ),等待一条消息来响应由某人从外部进行调用的服务接口的操作( <receive> ),生成输入/输出操作的响应( <reply> ),等待一段时间( <wait> ),把数据从一个地方复制到另一个地方( <assign> ),指明某个地方出错了( <throw> ),终止整个服务实例( <terminate> ),或者什么也不做( <empty> )。

通过使用语言所提供的任何结构化活动,可以将这些原语活动组合成更复杂的算法。这些结构化活动提供的能力有:定义一组步骤的有序序列( <sequence> ),使用现在常见的“case-statement”办法来产生分支( <switch> ),定义一个循环( <while> ),执行几条可选路径中的一条( <pick> ),以及指明一组步骤应该并行地执行( <flow> )。在并行地执行的一组活动中,您可以通过使用 链接(link)来指明执行顺序方面的约束。

BPEL4WS 允许您递归地组合结构化活动,以表达任意复杂的算法,这些算法表示了服务的实现。

与其它东西交互:伙伴

作为一种用来将一组服务组合在一起以形成一个新的服务的语言,BPEL4WS 流程由向其它服务提出调用和/或接收来自 客户机图 1 中服务的用户)的调用组成。前者通过使用 <invoke> 活动来做到,后者则通过使用 <receive><reply> 活动来做到。BPEL4WS 把与流程交互的其它服务称 伙伴(partner)。这样,伙伴或者是流程将其作为算法的一个主要部分进行调用的服务( 被调用的伙伴),或者是那些调用流程的服务( 客户机伙伴)。

第一种类型的伙伴是显而易见的 ― 流程无疑必须调用其它服务以完成一些事情。 <invoke> 活动指明要调用的伙伴以及要调用伙伴的哪个 portTypes 的什么操作。不过,请注意,被调用的伙伴最后同样也可以成为客户机 ― 流程调用伙伴上的某个操作以请求某种服务这种情况是可能出现的。随后,伙伴将调用流程上的操作以提供所期望的数据。

把流程的客户机当作伙伴对待的原因可能并不这么显而易见。这样做实际上有两个原因:第一个原因是,有时流程可能会需要调用其中一个客户机伙伴上的操作。异步交互的主要支持机制如下:客户机调用流程上的某个操作以请求某种服务。一旦完成,流程会调用客户机伙伴上的操作。此时,客户机伙伴与被调用的伙伴已没有什么明显差别。

第二个原因是,流程所提供的服务可能被不止一个客户机使用(使用全部服务或使用服务的几个部件)。此外,流程可能会希望区别服务的这些不同用户。举例来说,一个表示贷款服务系统的流程提供了单个 Web 服务,但只有其中的一些部件是申请贷款的客户能访问的,其他一些部分则是客户服务代表能访问的,最终是整个服务则只有贷款担保人才能访问。根据某个操作是由客户还是由担保人调用的,所返回的行为可能会有很大不同。另外,由于使用伙伴来模拟客户机,所以流程可以指明某些操作只能被某些客户机调用。

因此,伙伴可以分为以下几种:

  • 只由流程调用的服务。
  • 只调用流程的服务。
  • 或者既由流程调用又调用流程的服务(首先出现哪种情况都有可能)。

 

前两种分别是 被调用的伙伴客户机伙伴,它们都是简单明了的。请考虑第三种情况下流程首先调用服务时流程和服务之间的关系。这意味着服务提供了(或发布了)一个 portType(PT1),然后流程调用该 portType 的操作。同时,流程必须提供一个服务从其中调用操作的 portType(PT2)。这样,从流程的角度看,流程需要来自服务的 portType PT1 并提供 portType PT2 给服务。从服务的角度来看两者间的关系,则会得到一个相反的结论:服务提供 portType PT1 给流程并需要来自流程的 portType PT2。不管是流程首先调用服务还是相反,服务和流程的关系都同上所述。

服务链接类型
为第三种类型的伙伴建模时引出了 服务链接类型。服务链接类型不是从这些参与方中的某一方的角度来定义服务和流程之间的关系,而是表示一种第三方声明,用这个声明来说明了两个(也可能是更多个)服务之间的关系。服务链接类型定义了一组角色,其中每个角色指明一组 portType。其思想是,当两个服务彼此交互时,服务链接类型就是对这两个服务如何交互 ― 各方本质上提供了什么 ― 的声明。

BPEL4WS 用服务链接类型来定义伙伴。基本上,伙伴是这样来定义的:给伙伴一个名称,然后指明服务链接类型的名称,确定流程在这个服务链接类型中将充当什么角色,确定伙伴将充当什么角色。对于纯被调用的伙伴和纯客户机伙伴的情况,服务链接类型中将只有一个角色,因而在定义伙伴时只指明了一个角色。伙伴名称随后将在 <receive><reply><invoke> 中用来指明所期望的伙伴。

服务引用
伙伴在运行时是如何工作的呢?为了能够在运行时工作,伙伴必须解析成实际的 Web 服务。这样,伙伴实际上最后就是一个有类型的 服务引用而已,其类型信息来自服务链接类型和角色。BPEL4WS 流程本身不指定伙伴如何绑定到特定服务;人们认为这是一个部署时或运行时的绑定步骤,这个绑定步骤必须被 BPEL4WS 实现支持。

处理问题

开发者需要有处理业务流程中的错误和从错误恢复的手段。BPEL4WS 通过 <throw><catch> 构造在语言中内置了异常(故障)。BPEL4WS 的故障概念与 WSDL 的故障概念有直接联系,事实上,前者建立在后者的基础上。

此外,BPEL4WS 支持 补偿这个概念,这是一种允许流程设计者为某些不可逆的动作实现一些补偿动作的技术。举例来说,设想有一个旅行预定流程。一旦确认了一项预定,则必须执行一些显式操作才能取消这项预定。这些动作就称为原始动作的“补偿动作”。

BPEL4WS 引入了作用域这个概念,从而递归地支持了故障处理和补偿,作用域本质上是故障处理和/或补偿的单元。详细理解补偿和故障处理,需要一篇以它们为主题的文章,将来会提供一篇这样的文章。

服务的生命周期

这些服务的生命周期是什么样的呢?作为 BPEL4WS 流程实现的 Web 服务有一个实例生命周期模型。也就是说,这些服务的客户机总是与服务(流程)的某个特定实例交互。那客户机如何创建服务的实例呢?

与传统的分布式对象系统不同,BPEL4WS 实例不是通过工厂模式创建的。相反,BPEL4WS 中的实例是在服务的消息到达时隐式地创建的。也就是说,实例不是用显式的“实例标识(instance ID)”来标识,而是用数据消息中的一些关键字域来标识。举例来说,如果流程表示一个订单实现系统,则发票号码可能就是用来标识交互所涉及的某个特定实例的“关键字”域。这样,如果当消息到达流程的“启动”点时没有可用的匹配实例,那么就会自动创建一个新的实例并与消息中的关键字数据关联起来。在定位到了合适的实例之后,只能在流程的非启动点接受消息;也就是说,在这些情况下,消息事实上总是被传送到特定实例。在 BPEL4WS 中,找到一个合适的实例或者创建一个合适的实例(如有必要的话)的流程称为 消息相关性(message correlation)。将来也会有一篇讨论消息相关性的文章。

Architectural Pattern(4)-SOA相关名词概念解释(SCA、ESB、JBI、BPEL、WEB服务)以及关系说明

SOA,SCA,ESB,WebService,BPEL,JBI

BPEL开发实例

BPEL 实例教程 1. 环境配置..................................................................................

BPEL与Java

====================================================== 注:本文源代码点此下载 =============================...

Oracle BAM与Bpel集成

近日项目需要通过BPEL与BAM的集成对系统和各个业务接口进行监控,以便实时监控业务接口的运行状态。BAM与BPEL的集成通过Sensor实现,实现起来比较简单,主要有以下步骤: 1、定义了给BAM...

bpel 实例--- 一个 HelloBPEL 实例

安装好bpel后(安装bpel教程),进行HelloBpel实例。 步骤如下: (一)创建bpel project。 (二)创建BPEL Process file。 1) 点...

BPEL and Java

BPEL的作用    实现从面向过程到面向服务的转变需要一种语言以描述Web services是怎样被组织成业务流程。如果这种描述是可执行的,即允许我们定义抽象的流程,而且允许我们描述流程准确的执行规...
  • joehope
  • joehope
  • 2011年03月06日 14:50
  • 609

ActiveBpel部署运行BPEL流程实例

本文接收使用ActiveBpel开发,部署和运行BPEL流程实例。     本文的例子工程和服务工程请见附件。     1. 安装ActiveBpel5.0.2     要安装ActiveBpe...
  • The577
  • The577
  • 2017年03月23日 21:58
  • 70

准备SOA/BPEL应用

1 启动jdve1.6版本工具。 2 升级SAO套件: 步骤1:   步骤2:   步骤3:   步骤4:   步骤5 :找到步骤1中的套件(不能二个一起安装) 步骤6:选择后点击下一步并确定重启: ...

在Eclipse上配置bpel开发环境

1.前期准备 jdk1.6、Tomcat6.0、最新的Eclipse。(这里特殊说明一下,曾经试过jdk1.8以及jdk1.7,Tomcat7.x以及Tomcat8.x,发现在后面的开发过程中都会有...

使用BPEL创建Web服务组合

为简单起见,本例的Web服务组合只调用一个Web Service API。 本文环境是:Eclipse Juno Release + JRE 1.7 + Tomcat 7.0.29 + BPEL +...
  • steveyg
  • steveyg
  • 2015年07月02日 23:00
  • 510
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BPEL概念的理解
举报原因:
原因补充:

(最多只允许输入30个字)