一.综述
BPEL(业务流程执行语言)使用web service定义和执行业务流程,通过BPEL可以组合、编排和协调web服务自上而下地实现面向服务的体系结构(SOA),BPEL可以将多个Web service组合到一个新的复合服务中,重组后的结果仍然是一个web service。
二.背景
1.
BPEL基于XML和Web service,它使用一种基于web 的语言(xml),该语言支持web service技术系列,web service技术系列包括SOAP,WSDL,UDDI,web可靠性消息,web服务寻址,web服务协调以及web服务事务
2.web service的重组机制
提供两种web service的重组
编排和编制
编制:一个中央流程(可以是一个web service)控制相关的web service并协调对操作所涉及web service的不同操作的执行;相关的web service并不知道它们参与了更高级别的业务流程,只有中央协调员知道此目标,编制主要集中于操作的显示定义以及web服务的调用顺序;
编排:涉及的每个web service完全知道操作的时间一家交互对象,强调在公共业务流程中家平缓消息的写作方式,所有参与者都需要知道业务流程,要执行的操作,要交换的消息以及消息交换的时间;
目前BPEL应用中采用编制的方式可以形成可执行的流程在BPEL执行引擎中执行。
3.BPEL中提供基本活动和控制结构
基本活动<invoke><receive><reply><assign><wait><throw><terminate>
控制结构<sequence><flow><if><while><pick>
4.partnerLink
通常情况下,使用partner提供的服务,对持续时间较长的operation使用异步服务,而相对较短时间内返回结果的操作使用同步服务;
当使用BPEL定义业务流程时,实际上是定义了一个由现有服务组成的新web service,该新BPEL复合web service的接口使用一组端口类型(portType)来提供类似任何其他web service的操作,要调用BPEL描述的业务流程,必须调用生成的复合web service
三。定义BPEL流程
1.列出相关的web service清单
BPEL业务流程调用的web service,即合作伙伴web service,web service使用WSDL描述;
web service需要提供portType,通过它可以使用相应的operation返回需要的结果;
对于异步调用的web service,需要指定两个portType,第一个调用相应的operation执行操作,为返回结果,web service需要指定另外一个portTYpe,但是,尽管web service定义了两个portTYpe,但是它只实现前者,后者由接收返回结果的对象实现。例如,BPEL主流程调用一个web service则ResultBackPT在BPLE主流程中实现。
2.为BPEL流程定义WSDL
BPEL流程作为一个web service,需要为它定义WSDL,主BPEL流程需要公开TravelApprovalPT PortType,还必须声明ClientCallbackPT portType
3.定义合作伙伴链接类型
合作伙伴指BPEL流程的相关方(包括BPEL流程调用的web service以及调用BPEL流程的客户端)
合作伙伴链接类型表示BPEL流程与它们之间的交互
理想情况下,每个web service在wsdl中定义相应的partnerLinkType,使用wsdl包装partner的 web service
4.构建BPEL流程
BPEL流程框架
(1)加入命名空间
包括:目标命名空间,web service的WSDL文件的命名空间,BPEL流程WSDL的命名空间,所有BPEL活动标记声明命名空间;
(2)定义partnerLink
定义与此BPEL流程交互的不同方
每个partnerLink都与描述其特性的partnerLinkType相关
每个partnerLink最多指定两个属性
myRole:业务流程本身的角色
partnerRole:合作伙伴的角色
同步调用定义一个role,异步调用定义两个role,每个role指定portType确定其调用的web service
(3)变量定义
变量用于存储消息以及对消息进行重新格式化和转换,通常要为发送到partner和从partner受到的每个消息定义一个变量,必须要为每一个变量指定相应的类型,可以使用wsdl消息类型,xml简单类型,或者xml模式元素。
WSDL文件中定义了消息类型,portType,partnerLinkType...
(4)变量赋值
invoke一个变量时,需要输入变量,可以通过赋值语句(assign)赋值需要的部分
(5)对于同步调用,使用invoke语句直接得到返回的结果,对于异步调用,需要使用receive语句接收返回值。