业务流程语言BPEL编程思想及架构.docx
- 文档编号:23477615
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:69
- 大小:104.38KB
业务流程语言BPEL编程思想及架构.docx
《业务流程语言BPEL编程思想及架构.docx》由会员分享,可在线阅读,更多相关《业务流程语言BPEL编程思想及架构.docx(69页珍藏版)》请在冰豆网上搜索。
业务流程语言BPEL编程思想及架构
业务流程语言BPEL编程思想及架构
修订历史记录
1.概述
BPEL是一门用于自动化业务流程的形式规约语言。
用XML文档写入BPEL中的流程能在Web服务之间以标准化的交互方式得到精心组织。
这些流程能够在任何一个符合BPEL规范的平台或产品上执行。
所以,通过允许顾客们在各种各样的创作工具和执行平台之间移动这些流程,BPEL使得他们保护了他们在流程自动化上的投资。
尽管以前想使业务流程定义标准化,但BPEL已经引起了史无前例的兴趣,而且它最早在软件供应商中获得大量认可。
BPEL实现了抽象的WSDL接口的集成,所以它也属于SOA的解决方案之一.
2.业务流程的慨念及BPEL简史
2.1什么是业务流程
业务流程可以被定义为一个由各种不同功能的活动相连的一组有相互关系的任务,它们依照一定的业务逻辑和顺序依次执行。
业务流程有起点和终点,而且它们都是可重复的。
业务流程是企业实现商务目标的方法。
对于企业而言,业务流程是企业重要的知识资产,是企业的核心竞争力的体现,一个精心设计和执行的业务流程能够为企业创造价值并节约成本。
在著名作家佛里德曼的获奖作品《世界是扁平的:
21世纪简史》(THEWORLDISFLAT:
ABriefHistoryoftheTwenty-firstCentury)一书中,对经济全球化有着精彩的论述。
它描绘了一个由互联网、通信基础设施和新型软件搭建的全球舞台;在这个舞台上,人们能够以多种方式分享知识、劳动、娱乐和发现,并且创造新的商业机会。
佛里德曼举例说:
“如今沃尔玛是美国最大的公司,然而它什么也不生产,只是建立了这个非凡的供应环节,从世界各地进口非常便宜的商品……并把世界各地的产品送到消费者手里。
它是一个全球组装线。
”
在经济全球化的过程中,企业的边界变得模糊,企业会将任务分解为一系列的子任务,企业只关注于自己的核心竞争力所在,并将其他工作分包给最合适的人来完成。
企业需要通过业务流程将这些片断有机地组织在一起。
在这里我们可以深刻地认识到业务流程对企业的重要性。
定义业务流程并对其做出文档所花费的时间和努力是完全值得的。
在一个反映中国传统医学的电视剧中,当配置药剂的时候,掌柜把自己反锁在药房里,只有他会根据“秘方”将不同的药材调配成救死扶伤的灵药。
然而只有他一人掌握这个过程是非常危险的。
对于现代企业来说这更是不可能的,我们不可能只让配件制造主任了解企业的配件制造知识,然后让他每晚独自装配所有的零件。
只要定义了配件制造业务流程,配件制造工人可以随时来去,而且任何配件制造工人都可以随时取代另一个人的工作,这是因为工厂里的所有配件制造工人都理解并遵循业务流程。
我们可以学习、改变、评估,然后再次改变配件制造业务流程,因为该流程对于每个人都是可见的,而非局限于配件制造主任。
现代业务流程管理系统的历史可以追溯到工作流系统。
简单地来讲,工作流定义了业务流程中的参与者(Who)、所执行的工作(What)及何时执行(When)。
在企业IT环境中,工作流软件通常与企业应用集成(EnterpriseApplicationIntegration,EAI)系统结合在一起,成为企业应用的“黏合剂”,实现业务流程的自动化和流水线化。
传统工作流系统的最大缺陷就是:
它们大多采用了专有技术。
这使得业务流程与企业应用的结合变得非常复杂,通常需要很长时间进行部署和实施,而与企业外部系统进行集成则更加困难,无法适应全球化浪潮和互联网时代对企业灵活、无缝集成的需求。
人们开始考虑利用Web服务的开放性和标准化,来解决业务流程与企业应用之间的互操作性问题。
2.2BPEL简史
2002年7月,IBM、微软、BEA提交了BusinessProcessExecutionLanguageforWebServices(BPEL4WS)1.0的规范。
业务流程执行语言基于XML和Web服务技术,它融合了早期的IBM的WebServicesFlowLanguage(WSFL)及微软的XLANG规范的很多特点。
随后许多主要供货商如SAP和Siebel(已被Oracle并购)等公司陆续加入规范的制定,并催生了多项修改和改进,并于2003年3月发布了1.1版。
2003年4月,BPEL被提交结构化信息标准促进组织(OASIS)以实现标准化,并组建了Web服务业务流程执行语言技术委员会(WSBPELTC),该努力使BPEL在业界获得更为广泛的认可。
目前该技术委员会正在致力于下一代规范的制定工作,并将该规范重命名为WS-BPEL2.0。
虽然除BPEL之外还有一些业务流程规范,但是到目前为止,BPEL是最为成熟和被广泛支持的技术。
WebSphereProcessServer6.0提供了BPEL4WS1.1规范兼容实现,并支持制定中的WS-BPEL2.0草案。
除此之外还增加了对人员任务(WS-BPELExtensionforPeople)和Java语言(BPELJ)等扩展的支持。
在下文中,我们将利用WebSphereIntegrationDeveloper6.0和WebSphereProcessServer6.0来演示如何创建和运行BPEL流程。
关于本文涉及的BPEL规范,可以从下面网址获得:
http:
//www-128.ibm.com/developerworks/library/ws-bpel/
3.BPEL的基本特性
相对于对象组装技术,服务组装更为复杂。
人们必须面对SOA环境中异构的、松耦合的、自主的服务。
它们间的交互关系是动态的、按需发生的,而且缺少中央控制。
因此,BPEL提供的服务组装模型提供了下列特性。
(1)灵活性:
服务组装模型应该具有丰富的表现能力,能够描述复杂的交互场景,而且能够快速地适应变化。
(2)嵌套组装:
一个业务流程可以表现为一个标准的Web服务,并被组装到其他流程或服务中,构成更粗粒度的服务,提高了服务的可伸缩性和重用性。
(3)关注点分离:
BPEL只关注与服务组装的业务逻辑;其他关注点,比如服务质量(QoS,QualityofService),事务处理等,可被作为附加扩展,由具体实现平台进行处理。
(4)会话状态和生命周期管理:
与无状态的Web服务不同,一个业务流程通常具有明确的生命周期模型。
BPEL提供了对长时间运行的、有状态交互的支持。
(5)可恢复性:
这对于业务流程(尤其对长时间运行的流程)是非常重要的。
BPEL提供了内置的失败处理和补偿机制,对于可预测的错误进行必要的处理。
4.BPEL的基本思想
许多开发人员觉得BPEL很神秘,不知道到底是什么意思。
主要是因为它是根据很抽象的基于WSDL的WebService再定义一些抽象执行的流程。
其实BPEL一点都不神秘,是一个很简单的东西。
首先谈一下BPEL和WSDL的区别,WSDL只是定义接口参数,不会定义如何实现接口,而BPEL不仅有自己的接口定义(也是一个WSDL文件,包括输入参数、方法操作名、返回参数),BPEL会定义如何调用其他服务的接口来实现自己的接口。
简单地说,BPEL通过流程编程将各种接口组合在一起,其目的在于提供一个“集成了各种接口”的接口。
首先BPEL会有一个起点和终点。
1、它的起点就是“receive”,也就是接收它自己接口的输入参数。
2、它的终点就是“reply”,也就是得到它自己接口的返回参数。
整个BPEL就是定义如何通过它的接口输入参数,调用其他外部服务的接口,得到其接口的返回参数。
它最重要的是两个定义:
1、一个是赋值命令(Assign/Copy),通过赋值命令将某一变量值赋给所要调用的接口的输入参数。
2、另一个是调用命令(Invoke),通过Invoke命令来调用外部服务。
另外一个比较重要的就是条件命令(CaseCondition),根据变量的不同来定义各种条件,然后根据各种条件来调用不同的服务。
这些变量可以来自于输入参数,也可以来自于调用外部服务的结果。
作为BPEL运行环境的一个重要功能就是能够保存并查询到这些变量。
4.1用Java实例模拟BPEL的创建过程
这里用一个简单的实例来进一步说明BPEL的基本思想和核心本质,并用Java实例来模拟BPEL的创建过程。
首先假定已经有了两个WebService,一个为“加法服务”,专门处理两个数相加,名为AddService;另外一个为“减法服务”,专门处理两个数相减,名为SubtractService。
现在有一个新的需求,需要将上面两个WebService集成起来,也就是需要创建一个新的服务,称为“运算服务”,名为CaculatorService,它有一个运算类型的参数,当运算类型为“加法”时,调用加法服务,当运算类型为“减法”时,调用减法服务。
看到这里,读者可能会想,直接写一个Java程序,调用者两个WebService不就可以了吗?
笔者的回答是:
直接用Java编程当然可以,事实上现在大家就是这么做的。
但是Java本质上是一种具体的程序语言,只能运行于JVM的Java运行环境,不是一种抽象性的通用的标准语言,而BPEL是一种标准化的执行语言,如何能够真正运行BPEL不是它所关心的事情,它还需要各个厂商去开发自己的BPEL运行环境,尽管各个厂商所开发的BPEL的运行环境可能会不一样,但是同一个BPEL所开发的程序,应该可以运行于这些不同的BPEL运行环境,得到的结果应该是一样的。
就像WebService的WSDL文件一样,它只管如何定义服务、服务接口、服务操作、服务参数等,如何具体实现WebService不是WSDL所要关心的事情。
下面继续前面的实例,两个Service都会有自己的WSDL定义。
下面用实际的Java语言来类似地描述一下,以便于理解。
下面的AddService.java相当于AddService.wsdl(用Java的Interface可能更贴切一点,用Java的class可以说明得更详细一点)。
PublicclassAddService{
Publicdoubleadd(doubleaddParameter1,doubleaddParameter2){
DoubleaddResposne;
addResposne=addParameter1+addParameter2;
//WSDL不会定义具体如何实现,
//此处只是说明如何实现操作
ReturnaddResponse;
}
}
下面的SubstractService.java相当SubstractService.wsdl。
PublicclassSubstractService{
Publicdoublesubstract(doublesubstractParameter1,doublesubstractParameter2){
DoublesubstractResposne=substractParameter1-substractParameter2;
ReturnsubstractResposne;
}
}
下面用Java模拟BPEL的创建过程。
首先需要创建BPEL的接口,下面用CaculatorBPELInterface.java来说明,它将有3个参数,其中paramter1和paramter2是需要运算的两个数,第3个参数processType表示运算的类型。
PublicInterfaceCaculatorBPELInterface{
PublicdoublecaculatorProcess(doubleparameter1,doubleparameter2,StringprocessType);
}
下面将创建一个Java实现类,说明如何对应于BPEL的创建过程(许多语句(如一些变量定义和赋值定义)对Java来说是不必要的;为了模拟BPEL的创建过程,让Java开发人员更好地把握BPEL的创建过程,相应地加入了这些程序语句)。
PublicclassCaculatorBPELImpleimplementsCaculatorBPELInterface{
PublicdoublecaculatorProcess(doubleparameter1,doubleparameter2,StringprocessType){
//步骤1:
定义所要调用的外部类(相当于定义BPEL里面partnerLink)
AddServiceaddServer=newAddService();
SubstractServicesubstractSevice=newSubstractService();
/*步骤2:
定义输入和输出变量(相当于定义BPEL里面变量variable)
定义的变量如下:
●BPEL接口的输入和输出变量
●所要调用的外部类的接口方法的输入和输出变量*/
//定义BPEL接口的输入变量
DoublecaculatorProcessParameter1Request;
DoublecaculatorProcessParameter2Request;
DoublecaculatorProcessTypeRequest;
//定义BPEL接口的输出变量
DoublecaculatorProcessResponse;
//定义加法服务的输入变量
DoubleaddParameter1Request;
DoubleaddParameter2Request;
//定义加法服务的输出变量
DoubleaddResponse;
//定义减法服务的输入变量
DoublesubstractParameter1Request;
DoublesubstractParameter2Request;
//定义减法服务的输出变量
DoublesubstractParameter1Response;
//***将请求参数赋值给BPEL接口的输入变量(相当于BPEL的receive)
caculatorProcessParameter1Request=parameter1;
caculatorProcessParameter2Request=parameter2;
DoublecaculatorProcessTypeRequest=processType;
//步骤3:
定义条件,并调用外部接口
If(caculatorProcessTypeRequest.equals.(“add”’)
//(相当于BPEL的switch/condition/case)
{
//**下面将调用加法服务
//将接口请求变量传给加法服务的请求变量(相当于BPEL的assign/copy)
addParameter1Request=caculatorProcessParameter1Request;
addParameter2Request=caculatorProcessParameter2Request;
//调用addService的接口(相当于BPEL的Invoke)
addResponse=addServer.add(addParameter1Request,addParameter2Request);
//将addResponse赋值给BPEL接口的输出变量(相当于BPEL的assign/copy)
caculatorProcessResponse=addResponse;
}else//(相当于BPEL的condition/otherwise)
{
//将接口请求变量传给减法服务的请求变量(相当于BPEL的assign/copy)
substractParameter1Request=caculatorProcessParameter1Request;
substractParameter2Request=caculatorProcessParameter2Request;
//调用substractService的接口(相当于BPEL的invoke)
substractResponse=
substractServer.substract(substractParameter1Request,substractParameter2Request);
//将substractResponse赋值给BPEL接口的输出变量(相当于BPEL的assign/copy)
caculatorProcessResponse=substractResponse;
}
ReturncaculatorProcessResponse;//相当于BPEL的reply
}
}
4.2用实例概述BPEL的创建过程
上面已经用Java模拟了BPEL的创建过程。
下面将基于同样的实例,用描述性的WSDL和BPEL来实现其创建过程,使读者对BPEL能有一个整体性的掌握。
假设已经有了前面的加法服务和减法服务的WSDL文件,加法服务为AddService.wsdl,减法服务为Substract.wsdl,它们的主要内容如下所示:
AddService.wsdl
|――getRequest(请求消息)
|――addParameter1(double)
|――addParameter2(double)
|――getResponse(返回消息)
|――addResponse(double)
|――addServcie(portType接口)
|――add(operation接口操作)
|――AddService(service服务名称)
substractService.wsdl
|――getRequest(请求消息)
|――subtractParameter1(double)
|――subtractParameter2(double)
|――getResponse(返回消息)
|――substractResponse(double)
|――substractService(portType接口)
|――substract(operation接口操作)
|――SubstractService(服务名称)
下面需要为BPEL创建一个服务接口,caculator.wsdl如下:
caculatorService.wsdl
|――getRequest(请求消息)
|――parameter1(double)
|――parameter2(double)
|――processType(String)
|――getResponse(返回消息)
|――caculatorProcessResponse(double)
|――caculatorService(portType接口)
|――caculatorPorcess(operation接口操作)
|――CaculatorService(service服务名称)
下面介绍创建BPEL的基本过程,即caculatorServiceProcess.bpel(下面只是说明BPEL的创建过程,没有完全按照BPEL的语法,具体的BPEL语法和BPEL编程实例后面会详细介绍)。
1)创建变量<bpel:
variables>
所定义的变量包括:
1、BPEL接口的输入和输出变量。
2、所要调用的外部服务partnerLink的接口操作的输入和输出变量。
<bpel:
variables>
<!
—BPEL流程的请求变量和返回变量-->
variablename="request-bpel"messageType采用caculatorService/getRequest
variablename="response-bpel"messageType采用caculatorService/getResponse
<!
—加法服务的请求变量和返回变量-->
variablename="request-add"messageType采用addService/getRequest
variablename="response-add"messageType采用addService/getResponse
<!
—减法服务请求变量和返回变量-->
variablename="request-substract"messageType采用substractService/getRequest
variablename="response-substract"messageType采用substractService/getResponse
</bpel:
variables>
BPEL定义变量的方式与Java是不一样的,主要因为BPEL所调用的WSDL是XML语言上面的所定义的变量并不是对应一个具体的值,它实际上对应的是一个数据结构。
如caculatorService/getRequest对应的是caculatorService.wsdl下面的
getRequest
|――parameter1(double)
|――parameter2(double)
|――processType(String)
也就是说getRequest下面的所有参数都包含进去了。
2)创建接收<bpel:
receive>
<bpel:
receivename="request"partnerLink="CaculatorService"
portType="caculatorService"operation="caculatorPorcess"
variable="request-bpel">
Receive是整个BPEL的起点,所定义的变量request-bpel从服务请求中得到赋值,整个后面的业务过程将以这个请求变量作为触发点。
3)创建条件<bpel:
switch/case>
程序将根据不同的条件调用不同的服务,所以先要设立各种条件:
<bpel:
switch>
<bpel:
case
condition="getVariableData('request-bpel','payload','getRequest/processType'>='add'>
…调用加法服务
</bpel:
case>
上面的程序表示在request-bpel的变量中取出路径为getRequest/processType所对应的变量值,如果满足这个值为“add”的条件时,可以在里面加入程序,完成相应的任务。
<bpel:
otherwise>
……调用减法服务
<bpel:
otherwise>
如果上面的所有条件都不满足时,可以在里面加入程序,完成默认的任务。
4)给所要调用的服务的请求变量赋值<bpel:
assign/copy>
为了调用外部服务,先要给外部服务赋值:
<bpel:
assign>
<bpel:
copy>
<bpel:
fromvaria
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 业务流程 语言 BPEL 编程 思想 架构