關(guān)鍵詞:
bpel ??
java ??
web服務(wù) ?? ??????????????????????????????????????
原文鏈結(jié):http://www.theserverside.com/articles/article.tss?l=BPELJava
BPEL and Java
BPEL的作用
??? 實(shí)現(xiàn)從面向過程到面向服務(wù)的轉(zhuǎn)變需要一種語(yǔ)言以描述Web services是怎樣被組織成業(yè)務(wù)流程。如果這種描述是可執(zhí)行的,即允許我們定義抽象的流程,而且允許我們描述流程準(zhǔn)確的執(zhí)行規(guī)則,那將更好。而BPEL正是這樣一種語(yǔ)言。事實(shí)上它是最先具備以下特性的語(yǔ)言:
??? 1 允許我們定義抽象和可執(zhí)行的流程
??? 2 有大多數(shù)公司支持
??? 3 軟件運(yùn)行在bpel流程可以執(zhí)行(BPEL服務(wù)器)和設(shè)計(jì)(BPEL設(shè)計(jì)器)的平臺(tái)上
??? 在我們對(duì)BPEL做更深入的了解之前,先論述一下怎樣組織web服務(wù)。這通常有兩種方法:音樂演奏式和舞蹈式。音樂演奏式為一個(gè)中心進(jìn)程控制相關(guān)的web services并協(xié)調(diào)在操作中被調(diào)用的web services中不同操作的執(zhí)行。音樂演奏時(shí)的樂譜就是一次組織過程。被調(diào)用的web services并不知道他們被調(diào)用以組織成一個(gè)流程,也不知道他們是一個(gè)更高層業(yè)務(wù)流程的一部分(它們也不需要知道)。只有音樂演奏中的指揮者知道這些,所以音樂演奏方式是將清晰定義的操作和web services的調(diào)用順序集中起來(lái)管理的方式。
??? 相比而言舞蹈方式不依賴一個(gè)中心的協(xié)調(diào)器。每一個(gè)在舞蹈方式中被調(diào)用的web service清楚的知道何時(shí)執(zhí)行它的操作并且知道與誰(shuí)合作。舞蹈方式是專注與信息交互的合作方式。所有的參與者需要關(guān)注業(yè)務(wù)流程,操作的執(zhí)行,信息的交互以及信息交互的時(shí)機(jī)。
??? 通過對(duì)組合web services以執(zhí)行業(yè)務(wù)流程的了解,音樂演奏方式比之舞蹈方式為更靈活的處理方法:
???? 我們準(zhǔn)確的知道誰(shuí)對(duì)整個(gè)業(yè)務(wù)流程的執(zhí)行負(fù)責(zé)
???? 即使是那些不知道他們是一個(gè)業(yè)務(wù)流程一部分的web services,我們也可以組合
???? 當(dāng)錯(cuò)誤發(fā)生時(shí)我們也可以提供可選擇的替代
??? BPEL遵循音樂演奏的方式。舞臺(tái)方式為其他標(biāo)準(zhǔn)采用,比如WSCI(Web Services Choreogaphy Interface)和WS-CDL(Web Service Choreography Description Language)。比之BPEL,舞蹈方式還沒有獲得業(yè)界的支持。
??? 2002年8月,BEA、IBM、Microsoft開發(fā)出BPEL的第一個(gè)版本。從那時(shí)候起,越來(lái)越多廠商的加入使得在2003年3月在第一個(gè)版本基礎(chǔ)上做了一些調(diào)整和改進(jìn)的1.1版本的誕生。在2003年3月,BPEL被提交至OASIS組織作為標(biāo)準(zhǔn),后來(lái)WSBPELTC組織成立。
??? BPEL可以在公司內(nèi)部和公司之間使用。在公司內(nèi)部,BPEL的作用是標(biāo)準(zhǔn)化企業(yè)應(yīng)用集成和促進(jìn)以前孤立系統(tǒng)之間的集成。在企業(yè)之間,BPEL使得業(yè)務(wù)伙伴之間的集成更容易更高效。以BPEL描述的業(yè)務(wù)流程的定義在不影響現(xiàn)有系統(tǒng)的情況下完成升級(jí)。在已經(jīng)是函數(shù)環(huán)境或?qū)⒁ㄟ^web services方式提供服務(wù)的環(huán)境當(dāng)中BPEL是重要的技術(shù)。隨著web service技術(shù)得到越來(lái)越多的使用,BPEL的重要性將日漸增強(qiáng)。
BPEL語(yǔ)言
????? 現(xiàn)在讓我們看一下BPEL語(yǔ)言。BPEL作為一種語(yǔ)言具體設(shè)計(jì)用來(lái)定義業(yè)務(wù)流程。BPEL支持兩種不同類型的業(yè)務(wù)流程:
???? 可執(zhí)行流程允許我們指定嚴(yán)格的業(yè)務(wù)流程的細(xì)節(jié),他們由音樂演奏引擎執(zhí)行。在大多數(shù)情況下,BPEL被用作定義可執(zhí)行的流程
??? 抽象的業(yè)務(wù)協(xié)議允許我們指定僅僅在各參與者之間公共的信息交換。他們不包含處理流程的內(nèi)部細(xì)節(jié)并且不是可執(zhí)行的。
??? BPEL建立在XML和web services之上,它是一種基于XML的語(yǔ)言,支持包括SOAP,WSDL,UDDI,WS-Reliable消息,WS-Addressing,WS-Coordination和WS-Transaction的web services技術(shù)棧。BPEL汲取了兩種早先的工作流語(yǔ)言:WSFL(Web Services Flow Language)和XLANG。WSFL由IBM設(shè)計(jì),基于有向的內(nèi)容。XLANG由微軟設(shè),是一種程序塊結(jié)構(gòu)語(yǔ)言。BPEL融合了這兩種方法為業(yè)務(wù)流程的描述提供了豐富的語(yǔ)法。
??? 一個(gè)BPEL流程嚴(yán)格指定了參與的web services被調(diào)用的順序。這可以順序或并行地完成。使用BPEL我們可以表示有條件的行為,例如一個(gè)web service的執(zhí)行可以依賴前一個(gè)調(diào)用的結(jié)果。我們也可以構(gòu)建循環(huán),申明變量,拷貝和賦值變量,定義錯(cuò)誤處理程序等。通過組合這些結(jié)構(gòu),我們可以以一個(gè)算法方式定義復(fù)雜的業(yè)務(wù)流程。
??? 因此BPEL可以與像java這樣的一般編程語(yǔ)言相比,不過沒有java那樣強(qiáng)大。但另一方面,它更簡(jiǎn)單并適合業(yè)務(wù)流程的定義。因此BPEL不是對(duì)java這樣的高級(jí)語(yǔ)言的替代而是一個(gè)補(bǔ)充。讓我們了解一下一個(gè)典型的BPEL流程。首先,這個(gè)BPEL業(yè)務(wù)流程收到一個(gè)請(qǐng)求。為了處理這個(gè)請(qǐng)求,流程開始調(diào)用相關(guān)的web services并將最后的結(jié)果返回給最初的請(qǐng)求發(fā)送者。因?yàn)锽PEL流程需要與其他的web services通信,所以它非常依賴被合成web service所調(diào)用的web services的WSDL描述。
??? 一個(gè)BPEL流程由很多個(gè)步驟組成,每一步驟被稱為一個(gè)活動(dòng)。BPEL支持基本的和結(jié)構(gòu)化的活動(dòng)。基本的活動(dòng)即為基礎(chǔ)的結(jié)構(gòu),用作公共的任務(wù),比如:
??? 使用調(diào)用其他的web services
??? 通過發(fā)送一個(gè)消息等待客戶端調(diào)用業(yè)務(wù)流程使用(收到一個(gè)請(qǐng)求)
??? 使用對(duì)同步的操作產(chǎn)生響應(yīng)
??? 使用處理數(shù)據(jù)變量
??? 使用指示錯(cuò)誤和異常
??? 使用等待一段時(shí)間
??? 使用結(jié)束整個(gè)流程等等
??? 這樣我們可以組合這些和其他基本的活動(dòng)定義準(zhǔn)確反映業(yè)務(wù)流程步驟的復(fù)雜算法。為了組合基本的活動(dòng)BPEL支持一些結(jié)構(gòu)化的活動(dòng)。其中最重要的有:
??? 允許我們定義一系列按順序調(diào)用的活動(dòng)
??? 用來(lái)定義一系列并行調(diào)用的活動(dòng)
??? 用來(lái)構(gòu)建分支結(jié)構(gòu)
??? 用來(lái)定義循環(huán)
??? 在許多的替代路徑中選擇一個(gè)的操作使用
??? 每一個(gè)BPEL流程也可以使用申明變量,使用定義合作鏈接。我們將在文章的下面部分對(duì)合作鏈接作更多的探討。
??? 一個(gè)BPEL流程可能是同步也可能是異步的。一個(gè)同步的BPEL流程鎖定客戶端(使用這個(gè)流程的)直到這個(gè)流程完成并返回一個(gè)結(jié)果給客戶端。一個(gè)異步的流程不鎖定客戶端,而是使用一個(gè)回調(diào)來(lái)返回結(jié)果(如果結(jié)果存在的話)。通常我們使用異步的流程實(shí)現(xiàn)長(zhǎng)時(shí)間的流程,使用同步實(shí)現(xiàn)在一個(gè)相對(duì)短的時(shí)間里返回結(jié)果的流程。如果一個(gè)BPEL流程使用異步的web services,流程本身同時(shí)也是異步的(雖然這不是必須的)。
???? 對(duì)于客戶端來(lái)說(shuō),一個(gè)BPEL流程看起來(lái)就和其他的web service差不多。當(dāng)我們定義一個(gè)流程,實(shí)際上我們是在定義一個(gè)由已存在服務(wù)組合而成的新的web service。為了調(diào)用由BPEL描述的業(yè)務(wù)流程,我們需要調(diào)用合成出來(lái)的復(fù)合web service。下圖為一個(gè)BPEL流程的示意圖:
? 
?? 合作鏈接
上面我們提到BPEL也申明合作鏈接,現(xiàn)在讓我們解釋一下什么是合作鏈接。我們已經(jīng)提到BPEL和外部的web services的交互有兩種方式:
?? BPEL流程調(diào)用其他web services上的操作
?? BPEL流程接收客戶端的調(diào)用。在所有客戶端中有一個(gè)是發(fā)起最初調(diào)用的BPEL流程的使用者。其他客戶端是web services。舉例來(lái)說(shuō),是那些已經(jīng)為BPEL流程所調(diào)用,但是需要回調(diào)以返回結(jié)果。
?? BPEL把這些所有和它交互部分的鏈接稱之為合作鏈接(partner links)。合作者鏈接可以是被BPEL流程調(diào)用的web services,也可以是調(diào)用BPEL流程的客戶端。每一個(gè)BPEL流程至少有一個(gè)客戶端合作鏈接,因?yàn)楸厝挥幸粋€(gè)調(diào)用BPEL流程的客戶端。
??? 通常一個(gè)BPEL流程也至少有一個(gè)調(diào)用的合作鏈接,因?yàn)樗鼘⒄{(diào)用至少一個(gè)web service(通常不止一個(gè))。不管怎么樣,被調(diào)用的合作鏈接可能成為客戶端鏈接——這通常是在異步服務(wù)的情況下,流程調(diào)用一個(gè)操作的地方。然后這個(gè)服務(wù)(合作者)調(diào)用流程上的回調(diào)操作來(lái)返回被請(qǐng)求的數(shù)據(jù)。
??? BPEL像合作鏈接一樣對(duì)待客戶端有兩個(gè)原因。最顯而易見的是支持異步交互,第二個(gè)原因是基于BPEL流程可以提供服務(wù)的事實(shí)。這些通過端口類型提供的服務(wù)可以為多于一個(gè)的客戶端使用。流程可能希望區(qū)分不同客戶端并僅僅提供給他們經(jīng)授權(quán)的功能。舉例來(lái)說(shuō),一個(gè)保險(xiǎn)流程可能提供給汽車保險(xiǎn)客戶與房產(chǎn)保險(xiǎn)客戶不同的一系列操作。
??? 綜上述,我們可以看到合作鏈接描述了指向合作者的鏈接,這樣的合作者可能是:
??? 流程調(diào)用的服務(wù)
??? 調(diào)用流程的服務(wù)
??? 兩者兼而有之的服務(wù)——它們既被流程調(diào)用也調(diào)用流程
BPEL的例子
??? 為了了解BPEL流程究竟是什么樣子,下面我們給出一個(gè)選擇最好保險(xiǎn)服務(wù)的非常簡(jiǎn)單的BPEL流程。首先,我們申明指向一個(gè)BPEL流程客戶端(稱作client)和兩個(gè)保險(xiǎn)web服務(wù)(稱作insuranceA 和 insuranceB)的合作鏈接。
?
?1
<?xml?version="1.0"?encoding="utf-8"?>
?2
<process?name="insuranceSelectionProcess"??????????targetNamespace="http://packtpub.com/bpel/example/"?????????xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/"?????????xmlns:ins="http://packtpub.com/bpel/insurance/"?????????xmlns:com="http://packtpub.com/bpel/company/"?>
?3
<partnerLinks>
?4
??????<partnerLink?name="client"
?5
?????????????????partnerLinkType="com:selectionLT"
?6
???????????????????myRole="insuranceSelectionService"/>
?7
??????<partnerLink?name="insuranceA"???????????????????????????????????partnerLinkType="ins:insuranceLT"?
?8
?myRole="insuranceRequester"
?9
???????????????????partnerRole="insuranceService"/>
10
??????<partnerLink?name="insuranceB"???????????????????partnerLinkType="ins:insuranceLT"
11
???????????????????myRole="insuranceRequester"???????????????????partnerRole="insuranceService"/>
12
???</partnerLinks>??
13

14
然后,我們?yōu)楸kU(xiǎn)請(qǐng)求申明變量(InsuranceRequest),保險(xiǎn)A和B響應(yīng)(InsuranceAResposne, InsuranceBResposne),和最終的選擇(InsuranceSelectionResponse)


???<variables>
??????<!--?input?for?BPEL?process?-->
??????<variable?name="InsuranceRequest"
????????????????messageType="ins:InsuranceRequestMessage"/>
??????<!--?output?from?insurance?A?-->
??????<variable?name="InsuranceAResposne"????????????????messageType="ins:InsuranceResponseMessage"/>
??????<!--?output?from?insurance?B?-->
??????<variable?name="InsuranceBResposne"????????????????messageType="ins:InsuranceResponseMessage"/>
??????<!--?output?from?BPEL?process?-->
??????<variable?name="InsuranceSelectionResponse"????????????????messageType="ins:InsuranceResponseMessage"/>
???</variables>



最后,我們具體化流程步驟。首先我們從客戶端等待初始的請(qǐng)求信息()。然后我們使用并行調(diào)用()兩個(gè)保險(xiǎn)web服務(wù)。保險(xiǎn)服務(wù)返回保額,然后我們選擇低的保額(/ )并使用將結(jié)果返回給客戶(BPEL流程的調(diào)用者)


???<sequence>
??????<!--?Receive?the?initial?request?from?client?-->
??????<receive?partnerLink="client"
???????????????portType="com:InsuranceSelectionPT"???????????????operation="SelectInsurance"???????????????variable="InsuranceRequest"
???????????????createInstance="yes"?/>
?????<!--?Make?concurrent?invocations?to?Insurance?A?and?B?-->
??????<flow>
?????????<!--?Invoke?Insurance?A?web?service?-->
?????????<invoke?partnerLink="insuranceA"?????????????????portType="ins:ComputeInsurancePremiumPT"?????????????????operation="ComputeInsurancePremium"?????????????????inputVariable="InsuranceRequest"
?????????????????outputVariable="InsuranceAResposne"?/>
?????????<!--?Invoke?Insurance?B?web?service?-->
?????????<invoke?partnerLink="insuranceB"
?????????????????portType="ins:ComputeInsurancePremiumPT"
?????????????????operation="ComputeInsurancePremium"
?????????????????inputVariable="InsuranceRequest"
?????????????????outputVariable="InsuranceBResposne"?/>
??????</flow>
??????<!--?Select?the?best?offer?and?construct?the?response?-->
??????<switch>
????????<case?condition="bpws:getVariableData('InsuranceAResposne',
?????????????????????????'confirmationData','/confirmationData/Amount')
??????????????????????<=?bpws:getVariableData('InsuranceBResposne',
?????????????????????????'confirmationData','/confirmationData/Amount')">
???????????<!--?Select?Insurance?A?-->
???????????<assign>
?????????????<copy>
???????????????<from?variable="InsuranceAResposne"?/>
???????????????<to?variable="InsuranceSelectionResponse"?/>
?????????????</copy>
???????????</assign>
????????</case>
????????<otherwise>
???????????<!--?Select?Insurance?B?-->
???????????<assign>
?????????????<copy>
???????????????<from?variable="InsuranceBResposne"?/>
???????????????<to?variable="InsuranceSelectionResponse"?/>
?????????????</copy>
???????????</assign>
????????</otherwise>
??????</switch>
??????<!--?Send?a?response?to?the?client?-->
??????<reply?partnerLink="client"
?????????????portType="com:InsuranceSelectionPT"
?????????????operation="SelectInsurance"
?variable="InsuranceSelectionResponse"/>
???</sequence>
</process>
因?yàn)槊恳粋€(gè)BPEL流程都是一個(gè)web service,每一個(gè)BPEL流程也需要一個(gè)WSDL文檔。我們將不再對(duì)開發(fā)BPEL流程的更深入的細(xì)節(jié)作討論。更多的資料可以參閱由Packt Publishing于2004年10月出版的《web服務(wù)的業(yè)務(wù)流程執(zhí)行語(yǔ)言》(Business Process Execution Language for Web Services)
? BPEL和Java
? 看到從上面BPEL流程的例子一些人也許會(huì)想這樣一個(gè)組合用java也很容易實(shí)現(xiàn)。對(duì)于非常簡(jiǎn)單的流程來(lái)說(shuō)這是正確的。但是對(duì)于更復(fù)雜的流程來(lái)說(shuō)我們會(huì)看到BPEL比之Java的至少兩個(gè)重要的優(yōu)勢(shì)。
? BPEL比之Java的第一個(gè)優(yōu)勢(shì)是BPEL流程是可移植的,甚至可以運(yùn)行在Java平臺(tái)之外。BPEL流程可以在基于Java平臺(tái)的音樂演奏服務(wù)器上運(yùn)行也可以在任何其他的軟件平臺(tái)上運(yùn)行(如.Net平臺(tái))。這在使用不同平臺(tái)的B-B交互中顯得尤為重要。
? BPEL的第二個(gè)優(yōu)勢(shì)是它針對(duì)業(yè)務(wù)流程特性的支持。通常業(yè)務(wù)流程是長(zhǎng)時(shí)間運(yùn)行的,特別是他們?cè)趇nternet上實(shí)現(xiàn)與其他合作者交互的時(shí)候。有可能這樣流程的執(zhí)行需要幾分鐘,幾小時(shí),甚至是幾天才能完成。有可能它們調(diào)用一個(gè)web service需要等待一個(gè)相對(duì)長(zhǎng)的時(shí)間以獲得回調(diào)的結(jié)果。如果我們不使用一個(gè)BPEL流程而是使用一個(gè)Java應(yīng)用程序我們的大部分時(shí)間將會(huì)擔(dān)心什么線程已經(jīng)完成,什么仍然在運(yùn)行。我們將不得不跟蹤Java線程以確定那些我們能結(jié)束,又有哪些需要繼續(xù)運(yùn)行以獲得回調(diào)結(jié)果。
? BPEL也用相對(duì)簡(jiǎn)單的方式支持補(bǔ)償。對(duì)在業(yè)務(wù)流程中那些已經(jīng)成功完成操作的補(bǔ)償,或者撤銷操作是業(yè)務(wù)流程中最重要的問題之一。補(bǔ)償?shù)哪康氖腔謴?fù)這個(gè)被撤銷的業(yè)務(wù)流程中已經(jīng)執(zhí)行完成的活動(dòng)。
?? 補(bǔ)償與大多數(shù)業(yè)務(wù)流程的特性相關(guān),這種業(yè)務(wù)流程是長(zhǎng)時(shí)間運(yùn)行的并且使用異步的方式與松散耦合的web servcies通信。就成功完成來(lái)說(shuō)業(yè)務(wù)流程是非常脆弱的,因?yàn)樗麄兯褂玫臄?shù)據(jù)本身就是脆弱的。因?yàn)樗鼈兺ǔM跨多個(gè)合作伙伴(同時(shí)是多個(gè)企業(yè)),所以需要關(guān)注業(yè)務(wù)流程可能是完整執(zhí)行也可能部分結(jié)果是未完成的,即補(bǔ)償。這和在企業(yè)信息系統(tǒng)中的ACID事務(wù)類似。BPEL使用定義的補(bǔ)償操作的能力支持補(bǔ)償?shù)母拍?某種范圍上講這是特殊處理),這種特性稱之為長(zhǎng)時(shí)間事務(wù)(LRT)。
??? 業(yè)務(wù)流程也可能需要對(duì)中心事件做出反映。這樣的事件可能是消息事件或者警告事件。通過在端口類型上的調(diào)用操作消息事件由引入消息觸發(fā)。警告事件是時(shí)間相關(guān)的,并且在一段持續(xù)時(shí)間之后或者一個(gè)特殊的時(shí)間觸發(fā)。BPEL對(duì)業(yè)務(wù)流程中的事務(wù)管理提供了很好的支持。
??? 這樣就有并發(fā)活動(dòng)。在BPEL中并發(fā)活動(dòng)使用活動(dòng)來(lái)模擬。在標(biāo)簽內(nèi)聚集嵌套的活動(dòng)非常直觀,也對(duì)表示那些并不太復(fù)雜的并發(fā)場(chǎng)景非常有幫助。為了表達(dá)更復(fù)雜的場(chǎng)景,提供在活動(dòng)之間表達(dá)同步依賴的能力。換句話說(shuō),我們可以具體指定哪個(gè)活動(dòng)能夠開始,什么時(shí)候開始(依賴其他的活動(dòng))并且可以定義復(fù)雜的依賴。舉例來(lái)說(shuō),我們常常指定一個(gè)特定的活動(dòng)或幾個(gè)活動(dòng)必須在其他一個(gè)或幾個(gè)活動(dòng)結(jié)束之后才能開始。
??? 與web services的無(wú)狀態(tài)模式相比業(yè)務(wù)流程模式需要使用一個(gè)有狀態(tài)的模式。當(dāng)一個(gè)客戶端開始一個(gè)業(yè)務(wù)流程,一個(gè)新的實(shí)例將會(huì)創(chuàng)建。這個(gè)實(shí)例在業(yè)務(wù)流程的生命周期中存在。發(fā)送給業(yè)務(wù)流程的消息(使用在端口類型和通信端口上的操作)需要被轉(zhuǎn)送到正確的業(yè)務(wù)流程實(shí)例。BPEL提供使用特定業(yè)務(wù)數(shù)據(jù)來(lái)保存指向特定業(yè)務(wù)流程實(shí)例的機(jī)制。這種功能稱為相關(guān)性(correlation)。
??? 我們可以繼續(xù)討論,不過很明顯BPEL已設(shè)計(jì)用來(lái)滿足定義業(yè)務(wù)流程的需要。很明顯,BPEL作為一種編程語(yǔ)言或是一個(gè)平臺(tái)來(lái)說(shuō)都不能取代Java。事實(shí)上,Java平臺(tái)是運(yùn)行BPEL流程的一個(gè)選擇。
??? BPEL服務(wù)器和開發(fā)工具
??? 為了執(zhí)行BPEL流程我們需要一個(gè)音樂演奏式的服務(wù)器。這樣的服務(wù)器為可執(zhí)行的BPEL業(yè)務(wù)流程提供一個(gè)運(yùn)行的環(huán)境。BPEL與web services緊密相關(guān),也和支持web service開發(fā)的現(xiàn)代軟件平臺(tái)緊密相關(guān),特別是J2EE和.Net平臺(tái)。
??? BPEL服務(wù)器可以使用J2EE或者.Net應(yīng)用服務(wù)器的環(huán)境,這樣他們可以使用應(yīng)用服務(wù)器提供的服務(wù),比如安全,事務(wù),可伸縮性,和數(shù)據(jù)庫(kù)的集成,EJB組件服務(wù),如JMS的消息服務(wù)等等。
??? BPEL服務(wù)器在J2EE和.Net平臺(tái)上都已存在。在J2EE平臺(tái)下我們至少可以在以下中選擇:
???? Oracle BPEL Process Manager (http://www.oracle.com/technology/products/ias/bpel/index.html)
???? IBM WebSphere Business Integration Server Foundation??????? (http://www.ibm.com/software/integration/wbisf)
??? IBM alphaWorks BPWS4J (http://www.alphaworks.ibm.com/tech/bpws4j)
??? OpenStorm Service Orchestrator (http://www.openstorm.com)
???? Vergil VCAB Server (http://www.vergiltech.com/products_VCAB.php)
??? Active Endpoints ActiveWebflow Server (http://www.active-endpoints.com/products/index.html)
??? ActiveBPEL engine (http://www.activebpel.org/)
??? Fivesight Process eXecution Engine (http://www.fivesight.com/pxe.shtml)
??? 基于.Net平臺(tái)的BPEL服務(wù)器包括:
Microsoft BizTalk 2004 (http://www.microsoft.com/biztalk/)
OpenStorm Service Orchestrator (http://www.openstorm.com)
? OpenStorm提供包括J2EE和.NET平臺(tái)上的解決方案。除了BPEL音樂演奏式服務(wù)器之外還有一些可用的BPEL設(shè)計(jì)工具。這些工具支持對(duì)BPEL流程的圖形化開發(fā)并通常和服務(wù)器集成在一起:
?? Oracle BPEL Designer
? IBM WebSphere Studio Application Developer, Integration Edition
? IBM BPWS4J Editor
??Vergil VCAB Composer
?Active Endpoints ActiveWebflow Designer
當(dāng)Vergil VCAB Composer在.NET平臺(tái)上建立時(shí),Oracle, IBM和Active Endpoints的解決方案則是基于Java Eclipse框架。我們可以看到在Java平臺(tái)上更多可用的BPEL服務(wù)器和設(shè)計(jì)器。
BPEL+jAVA
? 我們已經(jīng)看到BPEL是組合web services成為業(yè)務(wù)流程的合適語(yǔ)言。BPEL不是一般普適性語(yǔ)言(也不想成為)。因此BPEL和JAVA相互配合,Java負(fù)責(zé)web services的編程實(shí)現(xiàn)和web services與BPEL流程的執(zhí)行平臺(tái)。
?? 如在規(guī)格說(shuō)明書中提到的,BPEL是可擴(kuò)展的。特別是BPEL可以擴(kuò)展至web services之外是非常有前景的。這意味著我們可以使用BPEL組合不同的資源而不僅僅是web services。在J2EE平臺(tái)中,可能包括EJBs,JMS,RMI,JCA和其他資源。對(duì)于這個(gè)問題通常有兩種解決方法:
??? 支持BPEL和Java代碼的混合,這就是BPELJ的思想
??? 用WSDL描述所有的資源(Java classes,EJBs,JMS等等),這是Web Services調(diào)用框架中的思想
? BPELJ提供在BPEL流程定義中包含java代碼(稱之為JAVA片斷)的可能性。這一方面使我們能夠從BPEL中直接調(diào)用Java資源(BPELJ支持Java合作者鏈接),另一方面,它給了BPELJ增強(qiáng)的能力,因?yàn)槭褂胘ava片斷,我們可以執(zhí)行諸如計(jì)算值,構(gòu)建XML文檔之類的任務(wù),也可以不用創(chuàng)建web服務(wù)就執(zhí)行其他代碼。我們也可以使用BPEL變量表達(dá)JAVA代碼片段。IBM和BEA支持BPELJ,并且已經(jīng)發(fā)表了BPELJ的白皮書。
??? 將java代碼整合進(jìn)BPEL流程以支持調(diào)用JAVA資源是非常有用的。但是,在某些情況下這樣的處理方式也會(huì)帶來(lái)缺點(diǎn)。對(duì)一個(gè)Java資源的調(diào)用不同于對(duì)一個(gè)web service的調(diào)用。web服務(wù)調(diào)用框架(WSIF)遵循另外一種處理思路:在BPEL中使用相同的語(yǔ)法調(diào)用資源或服務(wù)并使用WSDL來(lái)描述,即使它是一個(gè)不通過SOAP協(xié)議通信的Java資源。WSIF也允許我們將這樣的服務(wù)和實(shí)際的實(shí)現(xiàn)與協(xié)議相映射。
??? 換句話說(shuō),我們可以把對(duì)抽象服務(wù)的描述與基于SOAP協(xié)議的實(shí)現(xiàn)綁定,與Java類綁定,與EJB綁定或者其它支持的資源,這只需要修改WSDL綁定即可。在BPEL中沒有代碼的更改是必須的而支持BPEL擴(kuò)展也是需要的。對(duì)這種綁定的支持在由WSIF提供的支持者那里是堅(jiān)定不移的。
?? WSIF是最初由IBM的WSTK (Web Services Toolkit)開發(fā)中alphaWorks部分發(fā)展而來(lái)的Apache技術(shù)。現(xiàn)在如Oracle BPEL Process Manager的一些BPEL服務(wù)器已經(jīng)支持WSIF。
?? 這兩種方法,BPELJ和WSIF都適合現(xiàn)實(shí)世界的場(chǎng)景并且使得BPEL在EAI和B2B中都非常有用。
結(jié)束語(yǔ)
??? BPEL是面向過程轉(zhuǎn)向面向服務(wù)的一種重要語(yǔ)言。因?yàn)锽PEL具體設(shè)計(jì)用來(lái)定義業(yè)務(wù)流程,因此對(duì)業(yè)務(wù)流程的很多特殊性有很好的支持,如長(zhǎng)時(shí)間事務(wù),補(bǔ)償,事件管理,相關(guān)性等等。BPEL非常適合和J2EE平臺(tái)一起使用,很多BPEL服務(wù)器也是建立在J2EE之上的。結(jié)合BPEL和Java的BPELJ以及WSIF的思路使得BPEL的可用性越來(lái)越好。應(yīng)該看到正在制定的JBI(Java Business Integration)規(guī)范將會(huì)在JAVA平臺(tái)里給業(yè)務(wù)集成和BPEL一個(gè)更好的備有證明文件的位置。??
?
地址:http://cauzcy.bokee.com/4749126.html