(资料是比较老了,BPEL1.1版的,但对于初学者来说,是个不错的入门材料。比直接看标准容易理解)
转自 http://www-128.ibm.com/developerworks/cn/webservices/ws-bpel/part1/index.html
级别: 初级 2003 年 3 月 01 日 王 强, 软件工程师, 日本富士施乐(FujiXerox)
商业流程执行语言BPEL4WS(Business Process Execution Language For Web Services)是专为整合Web Services而制定的一项规范标准。它从本质上来说是IBM的WSFL和Microsoft的XLANG的结合物,目前已经成为业界标准。WSFL 支持图形化的流程,而XLANG在结构化构造方面有独到的方法,而BPEL4WS正是吸取了两者的优点,同时摒弃了一些复杂繁琐的部分,形成了一种较为自然的描述商业活动的抽象高级语言。
引言
本文主要介绍的有3个方面的内容
• BPEL4WS语言的特点。
• BPEL4WS语言主要元素使用技巧提示。
• BPEL4WS语言利用外部Web服务的技巧提示。
(注:对于BPEL4WS的基本语法介绍由于篇幅原因并没有包括在本文中,读者可以参阅附录中的相关资料介绍。)
1.BPEL4WS语言的特点
BPEL4WS语言从诞生到现在还不到一年的时间,我们可以说它是一门新的语言,但是它又不完全独立于现在已经存在的各种编程语言,从各方明进行总结,可以得出以下三个突出的特点:
〈一〉 BPEL4WS并不"新":
为什么说它并不新呢?这主要是因为光就BPEL4WS语言本身的语法结构以及编程的思想来说,它是被广大程序员所熟悉的(当然,你得熟悉XML语言和基本的程序设计思想,还有就是得有分布式系统的概念,如DCOM,CORBA等)。
BPEL4WS的文法是完全基于XML规范的,如果不考虑它的程序语言特性,大家完全可以把它理解为普通的XML文档规范,也就是说可以把BPEL4WS中的所有节点对应到一个虚拟的DTD文件中。如果不考虑它的程序特性,大家在编写BPEL文件的时候就只是按照这个DTD所定义的规范在编写普通的XML文件罢了。BPEL4WS主要基于以下几个XML规范的,WSDL 1.1、XML Schema 1.0 和XPath1.0。WSDL消息和XML Schema类型定义提供了BPEL4WS流程所需要的所有数据模型,所有需要的外部资源和伙伴都被描述为WSDL服务。
如果对BPEL4WS语言的语法做较深入的研究,你就会发现它其实只是对原有编程语言思想的继承和发展。
● 关于继承,BPEL4WS语言拥有传统编程语言的一些基本特性,如:
赋值操作(由对〈container〉的操作完成);
循环操作(由〈while〉操作完成);
选择操作(由〈switch〉和〈case〉操作完成);
远程调用操作(由〈invoke〉操作完成);
错误捕捉操作(由〈catchfault〉和〈catchall〉操作完成);
错误抛出操作(由〈throw〉操作完成)
Java,C#语言中的try操作(由〈scope〉操作完成)
● 关于发展,BPEL4WS语言是一门结合了商业处理特点的语言;
由于BPEL4WS语言是专为商业流程的执行所服务的,因此它也就自然而然的具有一门商业处理语言的特点,这体现在以下几个方面:
1>提供了对于远程调用(〈invoke〉)的同步和异步处理;
这主要是由商业处理的特点决定的,就拿民航订票来说吧,当你向民航订票系统的订票Web Service发出订票请求后,你不可能期望马上得到结果(同步),因为民航系统必须要首先要进行复杂的身份识别以确定你的系统是否有预订机票的权限,接着还要查询航班情况以确定是否你定的航班还有空座,然后才会给你答复,而你不可能一直等待得到答复,就算你愿意你的服务器恐怕也受不了这个负担。因此你必须选择异步方式,也就是发出请求后继续执行其他的操作,在这一点上有一点类似于TCP/IP协议和UDP协议的关系。
2〉提供了并行的操作(由〈flow〉操作支持);
对于普通的程序设计语言来说,并行的概念只是用于表面。打个比方,也许有人会说,利用windows系统(或者unix, linux系统)的多任务执行能力,我可以让一个程序一边在后台执行计算而前台却进行复杂的人机交互工作,这不也是一种并行吗。的确,这也是一种并行,但它只是cpu级别的并行,而BPEL4WS语言所体现的并行性是一种更广范围的并行,是基于INTERNET的并行,在某些方面,类似于传统的并行处理系统(利用机群进行大规模复杂并行计算)。通过BPEL4WS,可以同时调用位于不同地方(不同城市甚至是国家)的Web Services进行处理(如计算,订货等)。
3〉提供了补偿的操作(由〈compensate〉操作支持);
任何程序的执行都可能会出错,而后果也是不同的。有的操作出错并不会产生什么直接的后果,而有的操作出错的结果就必须被纠正,也就是必须执行一些补偿的操作。比如拿民航订票来说吧,假如顾客A在系统中预订一张机票,当民航系统的Web Services完成所有订票操作后,提交给顾客A请求确认时,顾客A由于其他原因取消了订票操作或者系统出现故障,那么就必须要执行补偿操作,取消所有已执行的操作,恢复数据库信息。从某个方面来说,这很类似于DBMS中的ROLLBACK操作,只不过在数据库系统中是微观执行的,而在BPEL4WS中是宏观执行的。
〈二〉 BPEL4WS并不"可执行":
BPEL4WS虽然定义为一门商业执行语言,但实际上它并不执行商业流程中的任何细节,也就是说它一点也不涉及到商业数据的存储和处理。BPEL4WS语言从本质上来说应该是一门描述性语言,它只是描述了什么时候?以什么顺序?到哪儿?去调用那些Web服务?怎样组织这些调用?罢了。因此,在BPEL4WS中并没有出现复杂的数据结构和数据类型,也没有关于数据存储和持久化的操作,唯一涉及显式数据操作的地方就是〈container〉的使用了,但容器中的数据只是一些临时数据,一旦商业处理的流程结束,这些数据也就消失了,这些数据就好像是传统程序语言中的变量一样,但又没有那么复杂的数据类型。说BPEL4WS语言是商业流程执行语言是因为从宏观上看,所有的操作都由BPEL4WS来完成,而其背后的操作,如Web服务的调用等是不可见的,也就是说是不透明的。这就好比软件测试中的黑盒测试一样,用户只看到了自己应该看到的用户接口,而不用去关心这些功能到底是怎样实现的。
〈三〉 BPEL4WS是真正的分布式系统:
随着INTERNET的迅速发展,在分布式技术领域也不断涌现出新技术新思想。SOAP,XML以及基于它们的Web Services,这些新技术的出现为新的分布式处理模型提供了坚实的基础,而BPEL4WS的诞生,才是分布式技术的真正升华。比起传统的分布式系统来说,利用BPEL4WS实现的分布式系统具有更高的灵活性,这主要体现在以下几个方面:
1〉各个节点机可以为异构系统:
2〉可以在运行时动态选择节点机进行处理:
3〉可以采用各种通信协议进行通信,只要符合SOAP协议。
2.BPEL4WS语言主要元素使用提示。
BPEL4WS语言中的各个元素就好像是传统编程语言中的关键字一样,正是由这些基本的元素组合到一起,构成了BPEL4WS的语言结构。从总体上划分,BPEL4WS语言可以被划分为最重要的四个部分(并不是所有BPEL4WS元素都包含在其中,这只是按主要功能进行划分的)
1〉数据处理
2〉基本活动
3〉结构化活动
4〉作用域
由于篇幅的关系,在这里就不进行详细的介绍了,相关的内容可以查阅BPEL4WS语言规范。
(英文版: http://www.ibm.comhttp://www.ibm.com/developerworks/library/ws-bpel/)
在实际的开发中,对于初学者来说,最容易迷惑的恐怕是BPEL4WS语言中关于各个元素之间相互包容关系的理解,这一点也是BPEL4WS语言比传统编程语言较为难的一点。用传统的编程开发语言进行开发,往往各个元素之间是可以互相嵌套的,而在BPEL4WS语言中各个元素之间的包含关系有着严格的规定,但遗憾的是这在它的Specification中并没有明确的指示出来(即没有显式的总结出来),也许对于一个资深BPEL4WS开发人员来说,一切都是那么自然而然,但对初学者来说,我觉得首先掌握BPEL4WS中各个元素之间的相互包含依赖关系是十分重要的。
下面是我为大家总结的BPEL4WS语言中的最重要的各个元素之间的包含依赖关系对照表。纵坐标代表母元素,也就是父节点;横坐标代表子元素,也就是子节点。有黑点标识的表示子节点(横坐标)可以包含于父节点(纵坐标)中,反之则不然。
3.BPEL4WS语言利用外部Web服务的技巧提示。
既然BPEL4WS语言本身并不执行任何业务操作,那么这些操作就必须由相应的Web服务来执行,这一点一定要体现在BPEL4WS的程序中。而如何调用这些外部的Web服务呢?这就要用到Web服务描述语言(WSDL)了。在WSDL文件中详细的描述了相关Web服务的细节内容,包括接口定义,消息定义,操作定义,连接定义等。
目前可以得到外部Web服务详细信息的途径主要有3条途径:
1〉通过本地的WSDL文件获得相关的Web服务信息。
优点:使用方便
缺点:不够灵活;不能保持与最新Web服务信息的同步
2〉通过TCP/IP协议获得分布于INTERNET上的Web服务的详细信息。
优点:可保持信息的同步
缺点:不能对同种类Web服务进行灵活选择。
3〉通过UDDI注册中心获得已注册的Web服务的详细信息。
优点:非常灵活,可以对登记在UDDI注册中心的所有同种类Web服务进行灵活的选择。
缺点:实现起来难度较大。
在得到需要的WSDL文件之后,我们就可以开始利用其中的信息进行系统的构架了。但是对于外部WSDL文件的使用上,有一点比较容易使初学者感到迷惑,那就是外部WSDL文件中的哪些信息对我们来说是有用的而哪些信息对我们来说是没用的。对于这一点,虽然在BPEL4WS的Specification中间接的介绍了,但遗憾的是没有详细的罗列出来。因此在此有必要做出较为详细的说明。
对于BPEL4WS语言中的各个元素来说,它们使用外部WSDL中的有用信息是通过它们的属性值来体现的。举个例子,在使用〈invoke〉时,我们必须指定相应的参数才可以完成调用,否则系统有哪能知道要调用什么操作呢?〈invoke〉操作如下所示:
<invoke name="getResults"
partner="getResultsService"
portType="getResultsPT"
operation="getResults"
inputContainer="getResultsData">
</invoke>
在上面的代码中,红色的属性说明这些属性值应来自外部的WSDL文件中;蓝色的属性说明这些属性值应来自这个BPEL4WS文件本身。这就说明在利用BPEL4WS文件构造系统的时候,不仅要注意那些来自外部WSDL文件中的有用信息,还要注意利用你所设计的BPEL4WS文件本身中已定义的一些信息。对于这一点在BPEL4WS的Specification中没有显式的提出来,希望在这里可以得到大家的注意。
(注:在IBM公司Eclipse开发环境中嵌入的BPEL4WS开发环境可以实现BPEL文件本身相关信息的动态处理,如显示在下拉框中;但遗憾的是对于来自外部WSDL中的信息没有动态处理和显示的功能。)
在下面的部分中,总结了BPEL4WS语言中各个元素的属性值的数据来源,希望对大家有所帮助。
BPEL4WS主要元素参数分析
〈一〉 来源于BPEL文件自身的参数:
(1) Container/Input Container/Output Container/Fault Container:
<数据来源>
来源于BPEL文件中的〈containers〉节点中的〈container〉节点的"name"属性。
<containers>
<container name="request"
messageType="lns:requestMessage"/>
<container name="reply"
messageType="lns:replyMessage"/>
</containers>
(2) Partner:
<数据来源>
来源于BPEL文件中的〈partners〉节点中的〈partner〉节点的"name"属性。
<partners>
<partner name="customer"
serviceLinkType="lns:buyServiceLinkType"
partnerRole="customer"/>
<partner name="seller"
serviceLinkType="lns:sellServiceLinkType"
partnerRole="seller"/>
</partners>
(3) Scope:
<数据来源>
来源于BPEL文件中的〈scope〉节点的"name"属性的值。
<scope name="buyScope" >
<compensationHandler>
<invoke partner="Seller" portType="SP:buy"
operation="CancelBuy"
inputContainer="getResponse"
outputContainer="getConfirmation">
<correlations>
<correlation set="buyOrder" pattern="out"/>
</correlations>
</invoke>
</compensationHandler>
</scope>
(4) Set:
<数据来源>
来源于BPEL文件中的〈correlation〉节点的"set"属性的值。
<correlations>
<correlation set="shipOrder" pattern="out"/>
</correlations>
(5) Pattern:
<数据来源>
来源于BPEL文件中的〈correlation〉节点的"name"属性。
<correlations>
<correlation set="buyOrder" pattern="out"/>
</correlations>
〈二〉 来源于外部WSDL文件中的参数:
(1) Operation:
<数据来源>
来源于外部WSDL文件中的〈portType〉节点中的〈operation〉节点的"name"属性。
<portType name="buyServicePT">
<operation name="buyRequest">
<input message="buyRequestMsg"/>
</operation>
</portType>
(2) PortType:
<数据来源>
来源于外部WSDL文件中的〈portType〉节点的"name"属性。
<portType name="buyServicePT">
<operation name="buyRequest">
<input message="buyRequestMsg"/>
</operation>
</portType>
(3) FaultName:
<数据来源>
来源于外部WSDL文件中的〈portType〉节点中的〈fault〉节点的"name"属性。
<portType name="buyServicePT">
<operation name="buyRequest">
<input message="buyRequestMsg"/>
</operation>
<fault name="buyFault">
</fault>
</portType>
(4) MessageType:
<数据来源>
来源于外部WSDL文件中的〈message〉节点的"name"属性。
<message name="buyRequestMsg">
<part name="buyOrder" type="buy:buyOrder"/>
</message>
<message name="buyNoticeMsg">
<part name="buyNotice" type="buy:buyNotice"/>
</message>
(5) MyRole/PartnerRole:
<数据来源>
来源于外部WSDL文件中的〈serviceLinkType〉节点中的〈role〉节点的"name"属性。
<slnk:serviceLinkType name="buyLT"
xmlns:slnk="http://schemas.xmlsoap.org/ws/2002/07/service-link/">
<slnk:role name="buyService">
<slnk:portType name="buyServicePT"/>
</slnk:role>
<slnk:role name="buyServiceCustomer">
<slnk:portType name="buyServiceCustomerPT"/>
</slnk:role>
</slnk:serviceLinkType>
(6) ServiceLinkType:
<数据来源>
来源于外部WSDL文件中的〈serviceLinkType〉节点的"name"属性。
<slnk:serviceLinkType name="buyLT"
xmlns:slnk="http://schemas.xmlsoap.org/ws/2002/07/service-link/">
<slnk:role name="buyService">
<slnk:portType name="buyServicePT"/>
</slnk:role>
</slnk:serviceLinkType>
结束语
在本文中简要的介绍了BPEL4WS语言的主要特点,BPEL4WS主要元素使用技巧以及利用外部Web服务的一些技巧。在以后的文章中,打算仔细的探讨有关利用BPEL4WS进行系统开发和商业流程架构的细节问题和技巧,希望能对大家有所帮助。
参考资料
1.BPEL4WS语言规范:
英文版: http://www.ibm.com/developerworks/library/ws-bpel/
2.Business processes: Understanding BPEL4WS, Part1-Part4:
http://www.ibm.comhttp://www.ibm.com/developerworks/library/ws-bpelcol/
3.W3C Note "Web Services Definition Language (WSDL) 1.1" 4.W3C Recommendation "The XML Specification"
posted on 2006-09-10 16:17
matthew 阅读(459)
评论(0) 编辑 收藏 所属分类:
Web Services and SOA