(資料是比較老了,BPEL1.1版的,但對于初學者來說,是個不錯的入門材料。比直接看標準容易理解)
轉自?http://www-128.ibm.com/developerworks/cn/webservices/ws-bpel/part1/index.html
級別:?初級????2003?年?3?月?01?日?王?強,?軟件工程師,?日本富士施樂(FujiXerox)
商業流程執行語言BPEL4WS(Business?Process?Execution?Language?For?Web?Services)是專為整合Web?Services而制定的一項規范標準。它從本質上來說是IBM的WSFL和Microsoft的XLANG的結合物,目前已經成為業界標準。WSFL?支持圖形化的流程,而XLANG在結構化構造方面有獨到的方法,而BPEL4WS正是吸取了兩者的優點,同時摒棄了一些復雜繁瑣的部分,形成了一種較為自然的描述商業活動的抽象高級語言。
引言
本文主要介紹的有3個方面的內容
•?BPEL4WS語言的特點。?
•?BPEL4WS語言主要元素使用技巧提示。?
•?BPEL4WS語言利用外部Web服務的技巧提示。?
(注:對于BPEL4WS的基本語法介紹由于篇幅原因并沒有包括在本文中,讀者可以參閱附錄中的相關資料介紹。)
1.BPEL4WS語言的特點
BPEL4WS語言從誕生到現在還不到一年的時間,我們可以說它是一門新的語言,但是它又不完全獨立于現在已經存在的各種編程語言,從各方明進行總結,可以得出以下三個突出的特點:
〈一〉?BPEL4WS并不"新":
為什么說它并不新呢?這主要是因為光就BPEL4WS語言本身的語法結構以及編程的思想來說,它是被廣大程序員所熟悉的(當然,你得熟悉XML語言和基本的程序設計思想,還有就是得有分布式系統的概念,如DCOM,CORBA等)。
BPEL4WS的文法是完全基于XML規范的,如果不考慮它的程序語言特性,大家完全可以把它理解為普通的XML文檔規范,也就是說可以把BPEL4WS中的所有節點對應到一個虛擬的DTD文件中。如果不考慮它的程序特性,大家在編寫BPEL文件的時候就只是按照這個DTD所定義的規范在編寫普通的XML文件罷了。BPEL4WS主要基于以下幾個XML規范的,WSDL?1.1、XML?Schema?1.0?和XPath1.0。WSDL消息和XML?Schema類型定義提供了BPEL4WS流程所需要的所有數據模型,所有需要的外部資源和伙伴都被描述為WSDL服務。
如果對BPEL4WS語言的語法做較深入的研究,你就會發現它其實只是對原有編程語言思想的繼承和發展。
●?關于繼承,BPEL4WS語言擁有傳統編程語言的一些基本特性,如:
賦值操作(由對〈container〉的操作完成);
循環操作(由〈while〉操作完成);
選擇操作(由〈switch〉和〈case〉操作完成);
遠程調用操作(由〈invoke〉操作完成);
錯誤捕捉操作(由〈catchfault〉和〈catchall〉操作完成);
錯誤拋出操作(由〈throw〉操作完成)
Java,C#語言中的try操作(由〈scope〉操作完成)
●?關于發展,BPEL4WS語言是一門結合了商業處理特點的語言;
由于BPEL4WS語言是專為商業流程的執行所服務的,因此它也就自然而然的具有一門商業處理語言的特點,這體現在以下幾個方面:
1>提供了對于遠程調用(〈invoke〉)的同步和異步處理;
這主要是由商業處理的特點決定的,就拿民航訂票來說吧,當你向民航訂票系統的訂票Web?Service發出訂票請求后,你不可能期望馬上得到結果(同步),因為民航系統必須要首先要進行復雜的身份識別以確定你的系統是否有預訂機票的權限,接著還要查詢航班情況以確定是否你定的航班還有空座,然后才會給你答復,而你不可能一直等待得到答復,就算你愿意你的服務器恐怕也受不了這個負擔。因此你必須選擇異步方式,也就是發出請求后繼續執行其他的操作,在這一點上有一點類似于TCP/IP協議和UDP協議的關系。?
2〉提供了并行的操作(由〈flow〉操作支持);?
對于普通的程序設計語言來說,并行的概念只是用于表面。打個比方,也許有人會說,利用windows系統(或者unix,?linux系統)的多任務執行能力,我可以讓一個程序一邊在后臺執行計算而前臺卻進行復雜的人機交互工作,這不也是一種并行嗎。的確,這也是一種并行,但它只是cpu級別的并行,而BPEL4WS語言所體現的并行性是一種更廣范圍的并行,是基于INTERNET的并行,在某些方面,類似于傳統的并行處理系統(利用機群進行大規模復雜并行計算)。通過BPEL4WS,可以同時調用位于不同地方(不同城市甚至是國家)的Web?Services進行處理(如計算,訂貨等)。?
3〉提供了補償的操作(由〈compensate〉操作支持);?
任何程序的執行都可能會出錯,而后果也是不同的。有的操作出錯并不會產生什么直接的后果,而有的操作出錯的結果就必須被糾正,也就是必須執行一些補償的操作。比如拿民航訂票來說吧,假如顧客A在系統中預訂一張機票,當民航系統的Web?Services完成所有訂票操作后,提交給顧客A請求確認時,顧客A由于其他原因取消了訂票操作或者系統出現故障,那么就必須要執行補償操作,取消所有已執行的操作,恢復數據庫信息。從某個方面來說,這很類似于DBMS中的ROLLBACK操作,只不過在數據庫系統中是微觀執行的,而在BPEL4WS中是宏觀執行的。?
〈二〉?BPEL4WS并不"可執行":
BPEL4WS雖然定義為一門商業執行語言,但實際上它并不執行商業流程中的任何細節,也就是說它一點也不涉及到商業數據的存儲和處理。BPEL4WS語言從本質上來說應該是一門描述性語言,它只是描述了什么時候?以什么順序?到哪兒?去調用那些Web服務?怎樣組織這些調用?罷了。因此,在BPEL4WS中并沒有出現復雜的數據結構和數據類型,也沒有關于數據存儲和持久化的操作,唯一涉及顯式數據操作的地方就是〈container〉的使用了,但容器中的數據只是一些臨時數據,一旦商業處理的流程結束,這些數據也就消失了,這些數據就好像是傳統程序語言中的變量一樣,但又沒有那么復雜的數據類型。說BPEL4WS語言是商業流程執行語言是因為從宏觀上看,所有的操作都由BPEL4WS來完成,而其背后的操作,如Web服務的調用等是不可見的,也就是說是不透明的。這就好比軟件測試中的黑盒測試一樣,用戶只看到了自己應該看到的用戶接口,而不用去關心這些功能到底是怎樣實現的。
〈三〉?BPEL4WS是真正的分布式系統:
隨著INTERNET的迅速發展,在分布式技術領域也不斷涌現出新技術新思想。SOAP,XML以及基于它們的Web?Services,這些新技術的出現為新的分布式處理模型提供了堅實的基礎,而BPEL4WS的誕生,才是分布式技術的真正升華。比起傳統的分布式系統來說,利用BPEL4WS實現的分布式系統具有更高的靈活性,這主要體現在以下幾個方面:
1〉各個節點機可以為異構系統:
2〉可以在運行時動態選擇節點機進行處理:
3〉可以采用各種通信協議進行通信,只要符合SOAP協議。
2.BPEL4WS語言主要元素使用提示。
BPEL4WS語言中的各個元素就好像是傳統編程語言中的關鍵字一樣,正是由這些基本的元素組合到一起,構成了BPEL4WS的語言結構。從總體上劃分,BPEL4WS語言可以被劃分為最重要的四個部分(并不是所有BPEL4WS元素都包含在其中,這只是按主要功能進行劃分的)
1〉數據處理
2〉基本活動
3〉結構化活動
4〉作用域
由于篇幅的關系,在這里就不進行詳細的介紹了,相關的內容可以查閱BPEL4WS語言規范。
(英文版:?http://www.ibm.comhttp://www.ibm.com/developerworks/library/ws-bpel/)?
在實際的開發中,對于初學者來說,最容易迷惑的恐怕是BPEL4WS語言中關于各個元素之間相互包容關系的理解,這一點也是BPEL4WS語言比傳統編程語言較為難的一點。用傳統的編程開發語言進行開發,往往各個元素之間是可以互相嵌套的,而在BPEL4WS語言中各個元素之間的包含關系有著嚴格的規定,但遺憾的是這在它的Specification中并沒有明確的指示出來(即沒有顯式的總結出來),也許對于一個資深BPEL4WS開發人員來說,一切都是那么自然而然,但對初學者來說,我覺得首先掌握BPEL4WS中各個元素之間的相互包含依賴關系是十分重要的。
下面是我為大家總結的BPEL4WS語言中的最重要的各個元素之間的包含依賴關系對照表。縱坐標代表母元素,也就是父節點;橫坐標代表子元素,也就是子節點。有黑點標識的表示子節點(橫坐標)可以包含于父節點(縱坐標)中,反之則不然。
?
3.BPEL4WS語言利用外部Web服務的技巧提示。
既然BPEL4WS語言本身并不執行任何業務操作,那么這些操作就必須由相應的Web服務來執行,這一點一定要體現在BPEL4WS的程序中。而如何調用這些外部的Web服務呢?這就要用到Web服務描述語言(WSDL)了。在WSDL文件中詳細的描述了相關Web服務的細節內容,包括接口定義,消息定義,操作定義,連接定義等。
目前可以得到外部Web服務詳細信息的途徑主要有3條途徑:
1〉通過本地的WSDL文件獲得相關的Web服務信息。
優點:使用方便
缺點:不夠靈活;不能保持與最新Web服務信息的同步
2〉通過TCP/IP協議獲得分布于INTERNET上的Web服務的詳細信息。
優點:可保持信息的同步
缺點:不能對同種類Web服務進行靈活選擇。
3〉通過UDDI注冊中心獲得已注冊的Web服務的詳細信息。
優點:非常靈活,可以對登記在UDDI注冊中心的所有同種類Web服務進行靈活的選擇。
缺點:實現起來難度較大。
在得到需要的WSDL文件之后,我們就可以開始利用其中的信息進行系統的構架了。但是對于外部WSDL文件的使用上,有一點比較容易使初學者感到迷惑,那就是外部WSDL文件中的哪些信息對我們來說是有用的而哪些信息對我們來說是沒用的。對于這一點,雖然在BPEL4WS的Specification中間接的介紹了,但遺憾的是沒有詳細的羅列出來。因此在此有必要做出較為詳細的說明。
對于BPEL4WS語言中的各個元素來說,它們使用外部WSDL中的有用信息是通過它們的屬性值來體現的。舉個例子,在使用〈invoke〉時,我們必須指定相應的參數才可以完成調用,否則系統有哪能知道要調用什么操作呢?〈invoke〉操作如下所示:
<invoke?name="getResults"
??????????????partner="getResultsService"
??????????????portType="getResultsPT"
??????????????operation="getResults"
??????????????inputContainer="getResultsData">
?</invoke>
在上面的代碼中,紅色的屬性說明這些屬性值應來自外部的WSDL文件中;藍色的屬性說明這些屬性值應來自這個BPEL4WS文件本身。這就說明在利用BPEL4WS文件構造系統的時候,不僅要注意那些來自外部WSDL文件中的有用信息,還要注意利用你所設計的BPEL4WS文件本身中已定義的一些信息。對于這一點在BPEL4WS的Specification中沒有顯式的提出來,希望在這里可以得到大家的注意。
(注:在IBM公司Eclipse開發環境中嵌入的BPEL4WS開發環境可以實現BPEL文件本身相關信息的動態處理,如顯示在下拉框中;但遺憾的是對于來自外部WSDL中的信息沒有動態處理和顯示的功能。)
在下面的部分中,總結了BPEL4WS語言中各個元素的屬性值的數據來源,希望對大家有所幫助。
BPEL4WS主要元素參數分析
〈一〉?來源于BPEL文件自身的參數:
(1)?Container/Input?Container/Output?Container/Fault?Container:
<數據來源>?
來源于BPEL文件中的〈containers〉節點中的〈container〉節點的"name"屬性。?
???<containers>
?????<container?name="request"?
????????????????messageType="lns:requestMessage"/>
?????<container?name="reply"?
????????????????messageType="lns:replyMessage"/>
???</containers>???
(2)?Partner:
<數據來源>?
來源于BPEL文件中的〈partners〉節點中的〈partner〉節點的"name"屬性。?
<partners>
??????<partner?name="customer"?
???????????????serviceLinkType="lns:buyServiceLinkType"
???????????????partnerRole="customer"/>
??????<partner?name="seller"?
???????????????serviceLinkType="lns:sellServiceLinkType"
???????????????partnerRole="seller"/>
???</partners>???
(3)?Scope:
<數據來源>?
來源于BPEL文件中的〈scope〉節點的"name"屬性的值。?
<scope?name="buyScope"?>
????<compensationHandler>
????????<invoke?partner="Seller"?portType="SP:buy"?
????????????????operation="CancelBuy"?
????????????????inputContainer="getResponse"
????????????????outputContainer="getConfirmation">
???????????<correlations>
??????????????<correlation?set="buyOrder"?pattern="out"/>
???????????</correlations>
????????</invoke>
????</compensationHandler>
</scope>????
(4)?Set:
<數據來源>?
來源于BPEL文件中的〈correlation〉節點的"set"屬性的值。?
<correlations>
???????<correlation?set="shipOrder"?pattern="out"/>
</correlations>
(5)?Pattern:
<數據來源>?
來源于BPEL文件中的〈correlation〉節點的"name"屬性。?
<correlations>
???????<correlation?set="buyOrder"?pattern="out"/>
</correlations>
〈二〉?來源于外部WSDL文件中的參數:
(1)?Operation:
<數據來源>?
來源于外部WSDL文件中的〈portType〉節點中的〈operation〉節點的"name"屬性。?
<portType?name="buyServicePT">
?<operation?name="buyRequest">
??<input?message="buyRequestMsg"/>
?</operation>
</portType>
(2)?PortType:
<數據來源>?
來源于外部WSDL文件中的〈portType〉節點的"name"屬性。?
<portType?name="buyServicePT">
?<operation?name="buyRequest">
??<input?message="buyRequestMsg"/>
?</operation>
</portType>
(3)?FaultName:
<數據來源>?
來源于外部WSDL文件中的〈portType〉節點中的〈fault〉節點的"name"屬性。?
<portType?name="buyServicePT">
?<operation?name="buyRequest">
??<input?message="buyRequestMsg"/>
?</operation>
?????<fault?name="buyFault">
?</fault>
</portType>
(4)?MessageType:
<數據來源>?
來源于外部WSDL文件中的〈message〉節點的"name"屬性。?
<message?name="buyRequestMsg">
?<part?name="buyOrder"?type="buy:buyOrder"/>
</message>
<message?name="buyNoticeMsg">
?<part?name="buyNotice"?type="buy:buyNotice"/>
</message>
(5)?MyRole/PartnerRole:
<數據來源>?
來源于外部WSDL文件中的〈serviceLinkType〉節點中的〈role〉節點的"name"屬性。
<slnk:serviceLinkType?name="buyLT"
???xmlns:slnk="http://schemas.xmlsoap.org/ws/2002/07/service-link/">
?<slnk:role?name="buyService">
??<slnk:portType?name="buyServicePT"/>
?</slnk:role>
?<slnk:role?name="buyServiceCustomer">
??<slnk:portType?name="buyServiceCustomerPT"/>
?</slnk:role>
</slnk:serviceLinkType>?
(6)?ServiceLinkType:
<數據來源>?
來源于外部WSDL文件中的〈serviceLinkType〉節點的"name"屬性。?
<slnk:serviceLinkType?name="buyLT"
???xmlns:slnk="http://schemas.xmlsoap.org/ws/2002/07/service-link/">
?<slnk:role?name="buyService">
??<slnk:portType?name="buyServicePT"/>
?</slnk:role>
</slnk:serviceLinkType>
結束語
在本文中簡要的介紹了BPEL4WS語言的主要特點,BPEL4WS主要元素使用技巧以及利用外部Web服務的一些技巧。在以后的文章中,打算仔細的探討有關利用BPEL4WS進行系統開發和商業流程架構的細節問題和技巧,希望能對大家有所幫助。
參考資料?
1.BPEL4WS語言規范:?
英文版:?http://www.ibm.com/developerworks/library/ws-bpel/?
2.Business?processes:?Understanding?BPEL4WS,?Part1-Part4:?
http://www.ibm.comhttp://www.ibm.com/developerworks/library/ws-bpelcol/?
3.W3C?Note?"Web?Services?Definition?Language?(WSDL)?1.1"?4.W3C?Recommendation?"The?XML?Specification"?
posted on 2006-09-10 16:17
matthew 閱讀(465)
評論(0) 編輯 收藏 所屬分類:
Web Services and SOA