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