概述 BPEL:全稱為Business Process Execution Language,即業務流程執行語言,是一種使用XML編寫的編程語言。用於自動化業務流程,也曾經被稱作WSBPEL和 BPEL4WS。廣泛使用於Web服務相關的項目開發中,優點為具有可移植性和有效保護了投資。 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>
這個流程圖表達的意思是:
就是一個簡單的BPEL語言設計狀態機工作流。