BPEL 语言介绍和应用

概述

BPEL:全称为Business Process Execution Language,即业务流程执行语言,是一种使用XML编写的编程语言。用于自动化业务流程,也曾经被称作WSBPEL和 BPEL4WS。广泛使用于Web服务相关的项目开发中,优点为具有可移植性和有效保护了投资。 
BPEL是一门用于自动化业务流程的形式规约语言。 用XML文档写入BPEL中的流程能在Web 服务之间以标准化的交互方式得到精心组织。这些流程能够在任何一个符合BPEL规范的平台或产品上执行。 所以,通过允许顾客们在各种各样的创作工具和执行平台之间移动这些流程,BPEL使得他们保护了他们在流程自动化上的投资。尽管以前想使业务流程定义标准化,但BPEL已经引起了史无前例的兴趣,而且它最早在软件供应商中获得大量认可。

抽象的和可执行的过程

可执行的过程是一个可以在一个计算机上执行的过程。抽象过程是用来描述一个过程的反应的。它被用在一个可执行过程的表面来将这个过程的内部行为掩饰起来不让业务对象看到。

发展状况

目前的版本是2.0,这个版本是OASIS于2007年4月11日推出的。

BPEL活动

BPEL常用的一些基本活动,这些是最基础的,也就是说不基于其它活动的活动:

      • assign——赋值
      • invoke——同步或异步地呼叫一个Web服务
      • receive/reply——提供一个同步或者异步呼叫一个Web服务的接口
      • throw——提示一个错误,一个故障处理可以处理这样的错误。假如一个错误不被处理的话它最终到达最高层后导致过程的终止
      • wait——等候一个时机或者一段时间
      • empty——无所事事,比如在一个错误发生后可以不做反应来消除这个错误

结构性活动,这些活动包括其它活动,可以以此建立复杂的过程:

      • sequence——按照一个序列处理一系列活动
      • while——在一个条件满足的情况下处理一个活动
      • switch——按照不同条件处理不同活动
      • flow——平行或者按照随意顺序处理活动
      • pick——按照外部事件从过程的角度不定值地选择

scopes——使用这个结构可以将一组活动组织在一起作为一个处理单位。通过这个组织方法多个活动可以使用同一个故障处理、事故处理和补偿处理。通过补偿处理BPEL可以处理长时间的处理。

1.Receive(接收)/ Reply(回答)

<receive>活动从流程的外部伙伴那获取数据,并将其保存到流程变量。通常一个Receive是一个流程的初始点,它会阻塞执行直到匹配的消息的到达。

<reply>活动发送消息给伙伴来应答通过receive活动所接收到的消息。receive和reply的组合对应着WSDL portType上定义的一个请求-响应操作。如果receive活动对应着一个单向(one-way)操作,则不能在流程中定义对应的reply活动。

2.Invoke请求

<invoke>活动允许业务流程同步或异步调用由合作伙伴提供的服务,服务实现可以是单向或请求-响应操作。Invoke活动使用“partnerLink”来引用伙伴服务。同过“portType”和“operation”指定相应的WSDL接口和操作。

3.Assign赋值

<assign>活动的作用是用新的数据来更新变量的值。Assign活动可以包括任意数量的基本复制操作。

4.Wait等待

<wait>活动会暂停流程执行,等待一段给定的时间或等到某一时刻才继续运行。在WebSphere Process Server 6.0中,开发者可以非常灵活地指定wait中的到期条件,比如等待多少秒,等到特定的一个日期,或是使用内置的日期表现法。也可以使用Java代码来动态指定等待时间。

BPEL也提供了丰富的结构化活动,可以灵活地控制流程执行。

5.Sequence顺序

<sequence>活动定义一组按顺序先后执行的活动。执行顺序是sequence活动中嵌套活动的先后顺序。当sequence中的最后一个活动完成后,该sequence活动也就完成了。

6.Flow流程

<flow>活动可以描述更为复杂的活动执行顺序。我们可以利用flow指定一个或多个并行执行的活动。为了定义任意的控制结构,可以在并行的活动中使用链接。

flow能进一步表达直接或间接嵌套在其中的活动之间的同步相关性,link(链接)用来表达这种同步相关性。

flow活动出现的所有link必须在flow活动中分开定义,并通过名称进行标识。flow活动中嵌套的活动需要通过source或target属性来标明该活动为哪个链接的源或目标活动。在flow活动中,对于每一个link必须有且仅有一个活动作为它的源活动,同样有且仅有一个活动作为它的目标活动。目标活动会在源活动完成之后执行。这样flow内部的活动就可以通过活动构成一个有向图。

我们还可以在link的源上定义transition(变迁)条件,当源活动完成之后,BPEL引擎会检查变迁条件是否满足,如果link的转移条件满足目标活动就会执行。

7.Switch分支

<switch>活动与传统的结构化语言的功能类似,从一组分支情况中选择一个特定的活动分支加以执行。switch由case元素定义的一个或多个条件分支的有序列表组成,后面可跟也可以不跟一个otherwise分支。以case分支的出现顺序检查,第一个条件是true的分支被选择并被作为被执行的活动。如果有条件的分支都未被选择,那么otherwise分支将被选择。

8.While——While循环

<while>活动也继承于传统的结构化编程思想,提供了while-do循环结构的支持。它可以包含一个或多个活动。它指定反复执行其内部活动,直到成功条件不被满足为止。在WPS中允许其使用Java代码来描述条件表达式。

9.Pick 选取(在WPS中被称为Receive Choice)

<pick>活动会等待一组相互排斥事件中的一个事件的发生,然后执行与发生的事件相关联的活动。它会阻塞业务流程执行,以等待某一特定的事件发生,比如接收到一个合适的消息或超时警报响起。当其中任何一个事件被触发后,业务流程就会继续执行,pick也随即完成了,不会再等待其他事件的发生。

每个pick活动必须至少包括一个onMessage事件。onMessage事件的语义等同于有关变量属性的可选类型的receive活动。pick活动还可以定义onAlarm事件用于指定超时警报。

以下是用BPEL定制的一个简单的状态机工作流流程程:

<process name="TestStateWorkFlow" targetNamespace="http://BusinessProcessDiagram1" xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/" xmlns:Pool="http://mypool" xmlns:tns=http://BusinessProcessDiagram1 
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <partnerLinks>
	    <partnerLink name="CommonState" partnerLinkType="lns:CommonState" myRole="EmployeeRole" 
       partnerRole="EmployeeParterRole" />
          <partnerLink name="ManageState" partnerLinkType="lns:ManageState" myRole="ManageRole" 
       partnerRole="ManageParterRole" />
	  <partnerLink name="DoneState" partnerLinkType="lns:DoneState" myRole="DoneRole" partnerRole="DoneParterRole" />
          <partnerLink name="RefuseState" partnerLinkType="lns:RefuseState" myRole="RefuseRole" partnerRole="RefuseParterRole" />
    </partnerLinks>
    <variables>
            <variable messageType="xsd:string" name="EmployeeOperation"/>
		<variable messageType="xsd:string" name="ManageOperation"/>
		<variable messageType="xsd:string" name="RemarkMessage"/>
    </variables>
    <sequence>
		<invoke name="Common" partnerLink="CommonState" portType="EmployeeAction" operation="StateOperation" 
          inputVariable="EmployeeOperation" />
        <switch name="EmployeeAction">
            <case condition="Submit">
                <sequence>
                   <invoke name="Manage" partnerLink="ManageState" portType="ManageAction" operation="StateOperation" 
           inputVariable="ManageOperation" />
                </sequence>
            </case>
	  <case condition="Resubmit">
                <sequence>
                   <invoke name="Manage" partnerLink="ManageState" portType="ManageAction" operation="StateOperation" 
           inputVariable="ManageOperation" />
                </sequence>
            </case>
            <case condition="Save">
                <sequence>
                   <invoke name="Common" partnerLink="CommonState" portType="EmployeeAction" operation="StateOperation" 
           inputVariable="EmployeeOperation" />
                </sequence>
            </case>
	  <case condition="Revoke">
                <sequence>
                   <invoke name="Common" partnerLink="CommonState" portType="EmployeeAction" operation="StateOperation" 
           inputVariable="EmployeeOperation" />
                </sequence>
            </case>
        </switch>
        <invoke name="Manage" partnerLink="ManageState" portType="ManageAction" operation="StateOperation" 
     inputVariable="ManageOperation" />
	<switch name="ManageAction">
            <case condition="Approve">
                <sequence>
                   <invoke name="Done" partnerLink="DoneState" portType="None" operation="StateOperation" 
           inputVariable="RemarkMessage" />
                </sequence>
            </case>
            <case condition="Reject">
                <sequence>
                   <invoke name="Refuse" partnerLink="RefuseState" portType="None" operation="StateOperation" 
           inputVariable="RemarkMessage" />
                </sequence>
            </case>
        </switch>
		<invoke name="Done" partnerLink="DoneState" portType="None" operation="StateOperation" 
         inputVariable="RemarkMessage" />
		<invoke name="Refuse" partnerLink="RefuseState" portType="None" operation="StateOperation" 
         inputVariable="RemarkMessage" />
    </sequence>
</process>

这个流程图表达的意思是:

就是一个简单的BPEL语言设计状态机工作流。

时间: 2024-10-13 10:37:34

BPEL 语言介绍和应用的相关文章

【转载】用平常语言介绍神经网络

http://wenku.baidu.com/link?url=23jM13V3Qe9Zx84FuEMebOMbTSk4i0Oaa5YPAVL1dfbSFC4G20GYDkUbbRvcJILgTGliXHPQgZqx5ToZscEOt0Iwp4eT71mRZhZ64USYk63 用平常语言介绍神经网络 (Neural Networks in Plain English) 因为我们没有能够很好了解大脑,我们经常试图用最新的技术作为一种模型来解释它.在我童年的时候,我们都坚信大脑是一部电话 交换机

Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量

Objective-C语言介绍 . Objc与C语言 . 面向对象编程 . 类和对象 . 属性和方法 . 属性和实例变量 1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成开发工具Xcode编写OC的HelloWorld程序,在Xcode的控制台中, 1.2 方案 首先,启动集成开发工具Xcode. 然后,创建OC语言的工程. 最后,运行所创建的工

Java众神之路(1)-语言介绍

Java语言介绍 1.Java的历史 我个人认为,学习一种技术,不止要关注技术本身,也应该去了解一下它的发展史,这一方面是对技术本身的尊重,另一方面也是希望能够通过该技术的发展历史推测出其未来可能的发展趋势,从而能够处处快人一步. 具体信息参见:http://blog.csdn.net/djsl6071/article/details/1681567 2.Java的特性 Java的特性有简单性.面向对象.分布式.解释型.可靠.安全.平台无关.可移植.高性能.多线程.动态性等. 下面我们将重点介绍

【转】Velocity模板(VM)语言介绍

http://www.blogjava.net/caizh2009/archive/2010/08/20/329495.html Velocity是什么? Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人 员可以只关注页面的显

Razor标记语言介绍

什么是Razor?   Razor的中文意思是"剃刀",它不是编程语言,只是一种服务器段的标记语言,与PHP和ASP类似   Razor允许你向网页中嵌入基于服务器的代码(Visual Basic 和 C#)的标记语法.当网页被写入浏览器时,   基于服务器的代码能够创建动态内容.在网页加载时,服务器在向浏览器返回页面之前,会执行页面内的基于服务器代码.   Razor支持C#和VB两种语言,其后缀名因使用的语言不同而不同,分别为.cshtml和.vbhtml Razor语法之注释  

R语言实战读书笔记1—语言介绍

第一章 语言介绍 1.1 典型的数据分析步骤 1.2 获取帮助 help.start() help("which") help.search("which") 1.3 管理R工作区间函数 1.3 输入和输出 1.3.1 输入 函数 source("filename") 可在当前会话中执行一个脚本.如果文件名中不包含路径,R将假设此脚本在当前工作目录中.举例来说, source("1.R") 将执行包含在文件1.R中的R语句集合

go语言介绍

go语言介绍 Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言. 背景 计算机硬件技术更新频繁,性能好,编程语言不能合理的利用多核多CPU优势 软件复杂程度越来越高,维护成本高,缺少简洁高效的编程语言,例如:风格不统一,计算能力不够,不能处理大并发 c系列项目运行速度快,但是开发效率和编译效率慢,存在内存泄露 python项目开发效率快,但是运行效率和CPU利用率低 罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob

Feekood脚本语言介绍(转)

转 http://blog.csdn.net/wooyoogame/article/details/43940511 想想现在的编程语言,可谓是五花八门,各有所长.技术的发展日新月异,可怜的程序猿不得不去阅读那些眼花缭乱的技术文档,了解那些层出不穷的开发框架,熟练使用各种各样的开发工具,搜索无法应对的开发问题. 试问有没有一门编程语言能够让程序猿在完全不用搭建任何开发环境,完全没有任何语言基础的情况下快速开发出简单实用.效果炫酷,而且跨平台的游戏或者应用呢. This is where amaz

计算机各大语言介绍

机器语言:纯粹的机器代码 汇编语言:8086汇编.Win32汇编..NET的汇编 高级语言: Basic.Pascal.Object Pascal.C.C++.C#.Java.ASP.ASP.NET.Perl.PHP.SQL.FoRTRAN 等等 Visual Basic.Visual Basic.NET.Delphi.Visual C++.C++ Builder.C# Builder.Visual Foxpro 等等  上面一排都是纯粹的编程语言,而下面一排都是经过发展过后的编程语言(应该可以