BPEL的概念
• BPEL(Business Process Execution Language)又叫BPEL4WS(Business Process Execution Language For Web Service),面向Web服務(wù)的業(yè)務(wù)流程執(zhí)行語(yǔ)言。是一種使用Web服務(wù)定義和執(zhí)行業(yè)務(wù)流程的語(yǔ)言。BPEL提供了一種相對(duì)簡(jiǎn)單易懂的方法,可將多個(gè)WEB服務(wù)組合到一個(gè)新的復(fù)合服務(wù)(稱作業(yè)務(wù)流程)中。
• BPEL本身是一個(gè)Web服務(wù),可以作為服務(wù)的提供者。
• BPEL是基於Web服務(wù)的,沒(méi)有Web服務(wù)就沒(méi)有BPEL。
BPEL的運(yùn)作方式
BPEL的一般構(gòu)成
• 一個(gè)以bpel為後綴的文件(例如MyFlow.bpel)
• 一個(gè)WSDL文件
• 一個(gè)部置XML文件,樣子形似bpel.xml
BPEL的實(shí)現(xiàn)需求
• 需要熟悉單個(gè)的Web Service的使用方法
• 需要了解具體的業(yè)務(wù)流程
• 需要一個(gè)運(yùn)行BPEL的處理器
• 需要一個(gè)流程設(shè)計(jì)器
• 當(dāng)然需要對(duì)BPEL語(yǔ)法標(biāo)簽的掌握等
8.6 BPEL的結(jié)構(gòu)
BPEL的一般結(jié)構(gòu)
• <process>
• <partnerLinks>
• <partnerLink>
• </partnerLink>
• </partnerLinks>
• <variables>
• <variable/>
• </variables>
• <faultHandlers>
• </faultHandlers>
• <sequence>
• Activities
• </sequence>
• </process>
<process>的屬性
<process name="ncname" targetNamespace="uri"
queryLanguage="anyURI"?
expressionLanguage="anyURI"?
suppressJoinFailure="yes|no"?
enableInstanceCompensation="yes|no"?
abstractProcess="yes|no"? xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/">
.
.
</process>
<partnerLinks>樣式
<partnerLinks>
<!– 注意:至少要指定一個(gè)角色. -->
<partnerLink name="ncname"
partnerLinkType="qname"
myRole="ncname“
partnerRole="ncname">
</partnerLink>
</partnerLinks>
<variables>樣式
<variables>
<variable name="ncname"
messageType="qname“/>
</variables>
<faultHandlers>樣式
<faultHandlers>
<catch faultName="qname“
faultVariable="ncname">
activity
</catch>
<catchAll>
activity
</catchAll>
</faultHandlers>
Activities包含具體如下
• <receive>
• <reply>
• <invoke>
• <assign>
• <throw>
• <terminate>
• <wait>
• <empty>
• <sequence>
• <switch>
• <while>
• <pick>
• <flow>
• <scope>
• <compensate>
基本活動(dòng)一
• <invoke>
– 調(diào)用某個(gè) Web 服務(wù)上的操作
• <receive>
– 等待一條消息來(lái)回應(yīng)由某人從外部進(jìn)行調(diào)用的服務(wù)介面的操作
• <reply>
– 生成輸入/輸出操作的回應(yīng)
• <wait>
– 等待一段時(shí)間
基本活動(dòng)二
• <assign>
– 把資料從一個(gè)地方複製到另一個(gè)地方
• <throw>
– 指明某個(gè)地方出錯(cuò)了
• <terminate>
– 終止整個(gè)服務(wù)實(shí)例
• <empty>
– 什麼也不做
結(jié)構(gòu)化活動(dòng)
• <sequence>
– 定義一組步驟的有序序列
• <switch>
– 使用現(xiàn)在常見(jiàn)的“case-statement”辦法來(lái)産生分支
• <while>
– 定義一個(gè)迴圈
• <pick>
– 執(zhí)行幾條可選路徑中的一條
• <flow>
– 以及指明一組步驟應(yīng)該並行地執(zhí)行
一個(gè)完整的簡(jiǎn)單示例
<process name="test" targetNamespace="http://acm.org/samples"
suppressJoinFailure="yes"
xmlns:tns="http://acm.org/samples"
xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:bpelx="http://schemas.oracle.com/bpel/extension"
xmlns:ora="http://schemas.oracle.com/xpath/extension"
xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/">
<partnerLinks>
<!-- The 'client' role represents the requester of this service. -->
<partnerLink name="client" partnerLinkType="tns:test" myRole="testProvider"/>
</partnerLinks>
<variables>
<variable name="input" messageType="tns:testRequestMessage"/>
<variable name="output" messageType="tns:testResponseMessage"/>
</variables>
<sequence name="main">
<receive name="receiveInput" partnerLink="client" portType="tns:test" operation="process" variable="input" createInstance="yes"/>
<assign name="creatReturnStr">
<copy>
<from expression="concat("Hello", bpws:getVariableData('input','payload','/tns:testRequest/tns:input'))"></from>
<to variable="output" part="payload" query="/tns:testResponse/tns:result"/>
</copy>
</assign>
<reply name="replyOutput" partnerLink="client" portType="tns:test" operation="process" variable="output"/>
</sequence>
</process>