zoukankan      html  css  js  c++  java
  • 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>

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

    StateWorkFlowStateDiagram

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

    欢迎各位参与讨论,如果觉得对你有帮助,请点击image    推荐下,万分谢谢.

    作者:spring yang

    出处:http://www.cnblogs.com/springyangwc/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    UVA 10617 Again Palindrome
    UVA 10154 Weights and Measures
    UVA 10201 Adventures in Moving Part IV
    UVA 10313 Pay the Price
    UVA 10271 Chopsticks
    Restore DB後設置指引 for maximo
    每行SQL語句加go換行
    种服务器角色所拥有的权限
    Framework X support IPV6?
    模擬DeadLock
  • 原文地址:https://www.cnblogs.com/springyangwc/p/2953880.html
Copyright © 2011-2022 走看看