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