技术开发 频道

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

    (2)结构化活动
    结构化活动(Structured activities)规定活动集合中的执行顺序。结构化活动描述了业务流程是如何被创建的。通过组合基础活动,结构化活动用来执行定义的结构,如相关的控制模式、故障和外部事件处理,以及流程实例间消息交换的协调。
    WS-BPEL定义了几种不同的控制流模式的结构化活动:
    按顺序执行的有<sequence>、<if>、<while>、<repeatUntil>和<forEach>。
    表示并发和同步的有<flow>。
    被外部和内部事件延迟选择控制的,使用<pick>。

  • Sequence

    <sqeuence>活动包含一个或多个按顺序执行的活动,执行顺序是这些活动在<sequence>元素中被列出的先后顺序,即词法顺序。当<sequence>中的最后一个活动完成后,该sequence活动也就完成。示例如下。
  
<sequence>
   <flow>...</flow>
   <scope>...</scope>
   <pick>...</pick>
</sequence>

  • If

    <if>活动提供条件选择。条件分支可以被<if>、<elseif>和<else>元素定义,类似编程语言的if/else语义。语法格式如下。
  
<if standard-attributes>
   standard-elements
   <condition expressionLanguage="anyURI"?>bool-expr</condition>
   activity
   <elseif>*
      <condition expressionLanguage="anyURI"?>bool-expr</condition>
      activity
   </elseif>
   <else>?
      activity
   </else>
</if>

  • While

    <while>活动支持指定的迭代活动的重复执行,执行一直继续到指定的布尔条件<condition>为真为止。语法如下。
  
<while standard-attributes>
   standard-elements
   <condition expressionLanguage="anyURI"?>bool-expr</condition>
   activity
</while>

  • RepeatUntil

    <repeatUntil>活动支持确定条件活动的重复执行,执行一直继续到指定的布尔条件<condition>为真为止。<repeatUntil>与<while>不同在于<repeatUntil>循环至少执行包含的条件活动一次。语法如下。
  
<repeatUntil standard-attributes>
   standard-elements
   activity
   <condition expressionLanguage="anyURI"?>bool-expr</condition>
</repeatUntil>

  • Pick

    <pick>活动会等待一组相互排斥事件中的一个事件发生,然后执行与发生的事件相关联的活动。它会阻塞业务流程执行,以等待某一特定事件发生,比如接收一个合适的消息或超时警报响起。当其中任何一个事件被触发后,业务流程就会继续执行,pick也随即完成,不会再等待其他事件的发生。每个<pick>活动必须至少包括一个onMessage事件。onMessage事件的语义等同于有关变量属性的可选类型的receive活动。pick活动还可以定义onAlarm事件用于指定超时警报。
    <pick>活动可以作为业务流程的起始点,指定流程可以接收多种不同的消息,并让流程在接收到特定消息后创建新的流程实例来处理消息。这里与<receive>活动类似,我们需要将<pick>活动的createInstance属性设置为"yes"。语法格式如下。
  
<pick createInstance="yes|no"? standard-attributes>
   standard-elements

   <onMessage partnerLink="NCName"
      portType="QName"?
      operation="NCName"
      variable="BPELVariableName"?
      messageExchange="NCName"?>+
      <correlations>?
         <correlation set="NCName" initiate="yes|join|no"? />+
      </correlations>
      <fromParts>?
         <fromPart part="NCName" toVariable="BPELVariableName" />+
      </fromParts>
      activity
   </onMessage>
   <onAlarm>*
      (
      <for expressionLanguage="anyURI"?>duration-expr</for>
      |
      <until expressionLanguage="anyURI"?>deadline-expr</until>
      )
      activity
   </onAlarm>
</pick>

  • Flow

    <flow>活动提供并发性和同步性。<flow>能进一步表达直接或间接嵌套在其中的活动之间的同步相关性,link用来表达这种同步相关性。
    <flow>活动出现的所有link必须在<flow>活动中分开定义,并通过名称进行标识。<flow>活动中嵌套的活动需要通过source或target属性来标明该活动为哪个链接的源或目标活动。在<flow>活动中,对于每一个link必须有且仅有一个活动作为它的源活动,同样有且仅有一个活动作为它的目标活动。目标活动会在源活动完成之后执行。这样<flow>内部的活动就可以通过活动构成一个有向图。语法格式如下。
  
<flow standard-attributes>
   standard-elements
   <links>?
      <link name="NCName">+
   </links>
   activity+
</flow>

  • ForEach

    <forEach>活动执行它包含的<scope>活动N+1次,N等于<finalCounterValue>减去<startCounterValue>的差值。语法格式如下。
  
<forEach counterName="BPELVariableName" parallel="yes|no"
   standard-attributes>
   standard-elements
   <startCounterValue expressionLanguage="anyURI"?>
      unsigned-integer-expression
   </startCounterValue>
   <finalCounterValue expressionLanguage="anyURI"?>
      unsigned-integer-expression
   </finalCounterValue>
   <completionCondition>?
      <branches expressionLanguage="anyURI"?
         successfulBranchesOnly="yes|no"?>?
         unsigned-integer-expression
      </branches>
   </completionCondition>
   <scope ...>...</scope>
</forEach>

0
相关文章