技术开发 频道

基于WS-BPEL2.0的服务组合研究

WS-BPEL 2.0的语法构造

    WS-BPEL支持的业务流程能够指定一组Web Services操作这些Web Service间共享的数据、业务流程涉及哪些伙伴和他们扮演的角色、一组Web Service的共同异常处理,以及关于多样参与的其它问题。为了实现这些功能,WS-BPEL引入了活动<Activity>、伙伴<Partner>、伙伴链接<PartnerLinks>、关联集合<Correlation Sets>、变量<Variables>、事件处理<Event Handlers>、错误处理<Fault Handlers>、作用域<Scope>和消息属性等关键元素(如图4所示)。


图4 BPEL流程定义


    流程(Process)由一系列活动<Activity>组成。流程通过伙伴链接<Partner Link>来定义与流程交互的其他服务。服务中可以定义一些变量(Variables,在BPEL4WS中被称为Container)。流程可以是有状态的长时间运行流程(long-running process)。流程引擎可以通过关联集合<Correlation Set>将消息关联到特定的流程实例。


图5 BPEL流程的主要组成元素


    1. Partner和Partner Links
    在BPEL中,与流程交互的任何实体都被称为伙伴(Partner)。它可以是一个业务伙伴,也可以是一个Web Service,或者是一个内部服务,比如EJB或简单Java类型。Partner也可以是启动流程的一个应用(Application)。由于在流程执行过程中,一个流程可能会调用多个伙伴的服务,又可能接收多个伙伴的请求,因此为了消除在通信过程中的多义性,我们需要明确服务和流程所扮演的角色。
    合作伙伴链接(PartnerLinks)是流程定义的一部分,可以把它看作一个partner的替代表示符(placeholder)。在BPEL中,这种流程与伙伴的合作关系是通过<partnerLink>元素来定义的。这样,如果在流程的活动中需要指定与特定伙伴的交互,只需要引用partnerLink的名称即可。而且,通过partner links的抽象,在流程建模时,我们不必指定具体的服务端点,而将流程与具体服务的绑定推迟到组装或运行时来完成。
    partnerLink通过引用partnerLinkType来定义流程与伙伴服务之间的通信接口(实际上是WSDL中的Port Type)。伙伴链接类型声明了两个(或多个)服务之间的关系。服务链接类型定义了一组角色,其中每个角色指明一组Port Type,即明确了该角色所提供的服务接口。partnerLinkType通常被定义在WSDL文档中,被BPEL流程所引用。通常Partner Link Type指定了服务间交互的类型。一个业务流程如果想使用partner link type就必须实现在Partner Link Type中定义的Port Type。引用过程如图6所示。我们定义一个订单服务(Purchase Order),它实现了左边的Port Type。在图5的右侧显示了一个发票服务(Invoice Service)及其相关的Port Type。这两个服务共有一个Partner Link Type定义(图中绿色域),使用这个partner link和其它服务进行通话。


图6


    除此以外,我们所关注的业务伙伴间的长运行流程和有状态交互,都需要使用PartnerLinks来实现。每次当你希望流程从相关服务发送或接受消息,也都需要引用与之相关的partner link。
    
    2. Variables
    在BPEL中,我们可以使用变量来保存和传递流程的状态信息。所保存的消息往往是已从伙伴那里接收到的消息或将被发送给伙伴的消息。变量的数据类型由WSDL定义,既可以是XML Schema内置的简单类型,又可以是自定义的复杂数据类型。变量可被指定为Invoke、Receive和Reply等活动的输入变量或输出变量,保存在服务间流动的数据消息。在流程开始的时候,所有的变量都未被初始化,可以通过赋值<Assign>活动或<Receive>活动接收消息来初始化变量。在业务流程执行过程中,一般通过赋值活动来实现数据在不同变量间的流转。变量在BPEL4WS 1.0中被称为容器(Container)。
    BPEL变量和Java变量的不同在于它们的类型系统。BPEL变量被WSDL消息类型所定义,由此一个变量可以有非常复杂的结构,也可以是一个简单的String类型(如图7所示)。


图7

0
相关文章