5. Activities
BPEL中的活动包括基本活动(Basic activities)和结构化活动(Structured activities)。基本活动负责实现一定的原子功能,如赋值(Assign)、调用Web服务(Invoke)等。结构化活动对控制流逻辑进行编码,利用循环(While)、分支(Pick)等元素对基本活动进行组装整合,以实现系统所需的逻辑功能。
每个活动都有两个可选的标准属性:
- name。name用来提供活动的机器可处理名称。
- suppressJoinFailure。表示在激活该活动失败时是否报错。
name="NCName"?
suppressJoinFailure="yes|no"?
每个活动都有两个可选的标准元素:<source>和<targets>,这些元素用来建立链接间的同步关系。<source>子元素指的是从该行为有哪些<link>元素被发出,<target>是指该行为被哪些<link>所指向。一个行为内允许有多个<source>和多个<target>元素。这两个子元素可以用standard-elements代替。
<targets>?
<joinCondition expressionLanguage="anyURI"?>?
bool-expr
</joinCondition>
<target linkName="NCName" />+
</targets>
<sources>?
<source linkName="NCName">+
<transitionCondition expressionLanguage="anyURI"?>?
bool-expr
</transitionCondition>
</source>
</sources>
(1)基础活动
- Invoke
<invoke>活动被用来调用服务提供者提供的Web Services。调用可以是同步的(请求-响应),也可以是异步的(单向)。Invoke活动使用"partnerLink"来引用伙伴服务,通过"portType"和"operation"指定相应的WSDL接口和操作。以下是请求-响应操作的例子。
<invoke partnerLink="NCName"
portType="QName"?
operation="NCName"
inputVariable="BPELVariableName"?
outputVariable="BPELVariableName"?
standard-attributes>
standard-elements
<correlations>?
<correlation set="NCName" initiate="yes|join|no"?
pattern="request|response|request-response"? />+
</correlations>
<catch faultName="QName"?
faultVariable="BPELVariableName"?
faultMessageType="QName"?
faultElement="QName"?>*
activity
</catch>
<catchAll>?
activity
</catchAll>
<compensationHandler>?
activity
</compensationHandler>
<toParts>?
<toPart part="NCName" fromVariable="BPELVariableName" />+
</toParts>
<fromParts>?
<fromPart part="NCName" toVariable="BPELVariableName" />+
</fromParts>
</invoke>
- Receive and Reply
业务流程通过<receive>活动和相应的<reply>活动把服务提供给它的伙伴。<receive>活动指定了它期望从哪个伙伴那里接收,还指定了它期望伙伴调用的端口类型和操作。<reply>活动被用来发送对先前通过<receive>活动被接受的请求的响应。<receive>和<reply>活动中都通过"partnerLink"来引用预定义伙伴关系,而且需要设置"portType"和"operation"属性来声明流程实现的WSDL portType和操作。实例如下。
<receive partnerLink="NCName"
portType="QName"?
operation="NCName"
variable="BPELVariableName"?
createInstance="yes|no"?
messageExchange="NCName"?
standard-attributes>
standard-elements
<correlations>?
<correlation set="NCName" initiate="yes|join|no"? />+
</correlations>
<fromParts>?
<fromPart part="NCName" toVariable="BPELVariableName" />+
</fromParts>
</receive>
- Assign
<assign>活动用来创建或修改variable内的数据。在业务流程中,经常需要变量variable间复制数据,比如用表达式构造和插入新数据。<assign>还可把endpoint references复制到partnerLinks,或把partnerLinks复制到endpoint references。语法格式如下所示。
<assign validate="yes|no"? standard-attributes>
standard-elements
(
<copy keepSrcElementName="yes|no"? ignoreMissingFromData="yes|no"?>
from-spec to-spec
</copy>
|
<extensionAssignOperation>
assign-element-of-other-namespace
</extensionAssignOperation>
)+
</assign>
- Throw
当业务流程需要显式地发出内部故障信号时可以使用<throw>活动。每个故障要有一个全局唯一的QName。<throw>活动必须为故障提供这样的名称,还可以可选地提供数据的变量,该变量提供有关故障的更多信息。故障处理程序可以使用这种数据,以分析和处理该故障,并添加进需要被发送到其它服务的所有故障消息。语法格式如下。
<throw faultName="QName" faultVariable="BPELVariableName"?
standard-attributes>
standard-elements
</throw>
- Wait
<wait>活动允许业务流程指定延迟时间的长短或到某个截止期限。实例如下。
<sequence>
<wait>
<until>'2002-12-24T18:00+01:00'</until>
</wait>
<invoke partnerLink="CallServer" portType="AutomaticPhoneCall"
operation="TextToSpeech" inputVariable="seasonalGreeting" />
</sequence>
- Empty
在流程中,有时也会需要使用一些不执行任何任务的活动。比如在故障需要被捕获和取消时,<empty>活动被用于这个目的。<empty>的另一个用途是在一个<flow>中提供同步点。语法如下。
<empty standard-attributes>
standard-elements
</empty>
- ExtensionActivity
BPEL流程定义能够包含之前规范未定义的新活动,通过<extensionActivity>声明,这个新活动被作为一个扩展活动。语法如下。
<extensionActivity>
<anyElementQName standard-attributes>
standard-elements
</anyElementQName>
</extensionActivity>
- Exit
<exit>活动被用来立即终止活动实例,但所终止的运行活动不包含termination handling、fault handling或compensation behavior。语法如下。
<exit standard-attributes>
standard-elements
</exit>
- Rethrow
<rethrow>活动被用在fault handler中重捕获已采集的故障信息,比如故障名、发生位置、故障数据等。它只能在fault handler(<catch>-<catchAll>)内部被使用。对故障数据的更改必须被<rethrow>忽略。例如,如果fault handler中的逻辑修改了故障数据,这时原始的故障数据可以通过调用<rethrow>被重新抛出,被修改的故障数据则是异于原始数据的。语法如下。
<rethrow standard-attributes>
standard-elements
</rethrow>