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/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM