精彩的人生

          好好工作,好好生活

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks
          關(guān)鍵詞bpel ?? java ?? web服務(wù) ?? ??????????????????????????????????????

          原文鏈結(jié):http://www.theserverside.com/articles/article.tss?l=BPELJava

          BPEL and Java

          BPEL的作用

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

          BPEL的例子
          ??? 為了了解BPEL流程究竟是什么樣子,下面我們給出一個選擇最好保險服務(wù)的非常簡單的BPEL流程。首先,我們申明指向一個BPEL流程客戶端(稱作client)和兩個保險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請求申明變量(InsuranceRequest),保險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>



          最后,我們具體化流程步驟。首先我們從客戶端等待初始的請求信息()。然后我們使用并行調(diào)用()兩個保險web服務(wù)。保險服務(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>



          因為每一個BPEL流程都是一個web service,每一個BPEL流程也需要一個WSDL文檔。我們將不再對開發(fā)BPEL流程的更深入的細節(jié)作討論。更多的資料可以參閱由Packt Publishing于2004年10月出版的《web服務(wù)的業(yè)務(wù)流程執(zhí)行語言》(Business Process Execution Language for Web Services)
          ? BPEL和Java
          ? 看到從上面BPEL流程的例子一些人也許會想這樣一個組合用java也很容易實現(xiàn)。對于非常簡單的流程來說這是正確的。但是對于更復(fù)雜的流程來說我們會看到BPEL比之Java的至少兩個重要的優(yōu)勢。
          ? BPEL比之Java的第一個優(yōu)勢是BPEL流程是可移植的,甚至可以運行在Java平臺之外。BPEL流程可以在基于Java平臺的音樂演奏服務(wù)器上運行也可以在任何其他的軟件平臺上運行(如.Net平臺)。這在使用不同平臺的B-B交互中顯得尤為重要。
          ? BPEL的第二個優(yōu)勢是它針對業(yè)務(wù)流程特性的支持。通常業(yè)務(wù)流程是長時間運行的,特別是他們在internet上實現(xiàn)與其他合作者交互的時候。有可能這樣流程的執(zhí)行需要幾分鐘,幾小時,甚至是幾天才能完成。有可能它們調(diào)用一個web service需要等待一個相對長的時間以獲得回調(diào)的結(jié)果。如果我們不使用一個BPEL流程而是使用一個Java應(yīng)用程序我們的大部分時間將會擔(dān)心什么線程已經(jīng)完成,什么仍然在運行。我們將不得不跟蹤Java線程以確定那些我們能結(jié)束,又有哪些需要繼續(xù)運行以獲得回調(diào)結(jié)果。
          ? BPEL也用相對簡單的方式支持補償。對在業(yè)務(wù)流程中那些已經(jīng)成功完成操作的補償,或者撤銷操作是業(yè)務(wù)流程中最重要的問題之一。補償?shù)哪康氖腔謴?fù)這個被撤銷的業(yè)務(wù)流程中已經(jīng)執(zhí)行完成的活動。
          ?? 補償與大多數(shù)業(yè)務(wù)流程的特性相關(guān),這種業(yè)務(wù)流程是長時間運行的并且使用異步的方式與松散耦合的web servcies通信。就成功完成來說業(yè)務(wù)流程是非常脆弱的,因為他們所使用的數(shù)據(jù)本身就是脆弱的。因為它們通常橫跨多個合作伙伴(同時是多個企業(yè)),所以需要關(guān)注業(yè)務(wù)流程可能是完整執(zhí)行也可能部分結(jié)果是未完成的,即補償。這和在企業(yè)信息系統(tǒng)中的ACID事務(wù)類似。BPEL使用定義的補償操作的能力支持補償?shù)母拍?某種范圍上講這是特殊處理),這種特性稱之為長時間事務(wù)(LRT)。
          ??? 業(yè)務(wù)流程也可能需要對中心事件做出反映。這樣的事件可能是消息事件或者警告事件。通過在端口類型上的調(diào)用操作消息事件由引入消息觸發(fā)。警告事件是時間相關(guān)的,并且在一段持續(xù)時間之后或者一個特殊的時間觸發(fā)。BPEL對業(yè)務(wù)流程中的事務(wù)管理提供了很好的支持。
          ??? 這樣就有并發(fā)活動。在BPEL中并發(fā)活動使用活動來模擬。在標簽內(nèi)聚集嵌套的活動非常直觀,也對表示那些并不太復(fù)雜的并發(fā)場景非常有幫助。為了表達更復(fù)雜的場景,提供在活動之間表達同步依賴的能力。換句話說,我們可以具體指定哪個活動能夠開始,什么時候開始(依賴其他的活動)并且可以定義復(fù)雜的依賴。舉例來說,我們常常指定一個特定的活動或幾個活動必須在其他一個或幾個活動結(jié)束之后才能開始。
          ??? 與web services的無狀態(tài)模式相比業(yè)務(wù)流程模式需要使用一個有狀態(tài)的模式。當(dāng)一個客戶端開始一個業(yè)務(wù)流程,一個新的實例將會創(chuàng)建。這個實例在業(yè)務(wù)流程的生命周期中存在。發(fā)送給業(yè)務(wù)流程的消息(使用在端口類型和通信端口上的操作)需要被轉(zhuǎn)送到正確的業(yè)務(wù)流程實例。BPEL提供使用特定業(yè)務(wù)數(shù)據(jù)來保存指向特定業(yè)務(wù)流程實例的機制。這種功能稱為相關(guān)性(correlation)。
          ??? 我們可以繼續(xù)討論,不過很明顯BPEL已設(shè)計用來滿足定義業(yè)務(wù)流程的需要。很明顯,BPEL作為一種編程語言或是一個平臺來說都不能取代Java。事實上,Java平臺是運行BPEL流程的一個選擇。
          ??? BPEL服務(wù)器和開發(fā)工具
          ??? 為了執(zhí)行BPEL流程我們需要一個音樂演奏式的服務(wù)器。這樣的服務(wù)器為可執(zhí)行的BPEL業(yè)務(wù)流程提供一個運行的環(huán)境。BPEL與web services緊密相關(guān),也和支持web service開發(fā)的現(xiàn)代軟件平臺緊密相關(guān),特別是J2EE和.Net平臺。
          ??? BPEL服務(wù)器可以使用J2EE或者.Net應(yīng)用服務(wù)器的環(huán)境,這樣他們可以使用應(yīng)用服務(wù)器提供的服務(wù),比如安全,事務(wù),可伸縮性,和數(shù)據(jù)庫的集成,EJB組件服務(wù),如JMS的消息服務(wù)等等。
          ??? BPEL服務(wù)器在J2EE和.Net平臺上都已存在。在J2EE平臺下我們至少可以在以下中選擇:
          ???? 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平臺的BPEL服務(wù)器包括:
          Microsoft BizTalk 2004 (http://www.microsoft.com/biztalk/)
          OpenStorm Service Orchestrator (http://www.openstorm.com)
          ? OpenStorm提供包括J2EE和.NET平臺上的解決方案。除了BPEL音樂演奏式服務(wù)器之外還有一些可用的BPEL設(shè)計工具。這些工具支持對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平臺上建立時,Oracle, IBM和Active Endpoints的解決方案則是基于Java Eclipse框架。我們可以看到在Java平臺上更多可用的BPEL服務(wù)器和設(shè)計器。
          BPEL+jAVA
          ? 我們已經(jīng)看到BPEL是組合web services成為業(yè)務(wù)流程的合適語言。BPEL不是一般普適性語言(也不想成為)。因此BPEL和JAVA相互配合,Java負責(zé)web services的編程實現(xiàn)和web services與BPEL流程的執(zhí)行平臺。
          ?? 如在規(guī)格說明書中提到的,BPEL是可擴展的。特別是BPEL可以擴展至web services之外是非常有前景的。這意味著我們可以使用BPEL組合不同的資源而不僅僅是web services。在J2EE平臺中,可能包括EJBs,JMS,RMI,JCA和其他資源。對于這個問題通常有兩種解決方法:
          ??? 支持BPEL和Java代碼的混合,這就是BPELJ的思想
          ??? 用WSDL描述所有的資源(Java classes,EJBs,JMS等等),這是Web Services調(diào)用框架中的思想
          ? BPELJ提供在BPEL流程定義中包含java代碼(稱之為JAVA片斷)的可能性。這一方面使我們能夠從BPEL中直接調(diào)用Java資源(BPELJ支持Java合作者鏈接),另一方面,它給了BPELJ增強的能力,因為使用java片斷,我們可以執(zhí)行諸如計算值,構(gòu)建XML文檔之類的任務(wù),也可以不用創(chuàng)建web服務(wù)就執(zhí)行其他代碼。我們也可以使用BPEL變量表達JAVA代碼片段。IBM和BEA支持BPELJ,并且已經(jīng)發(fā)表了BPELJ的白皮書。
          ??? 將java代碼整合進BPEL流程以支持調(diào)用JAVA資源是非常有用的。但是,在某些情況下這樣的處理方式也會帶來缺點。對一個Java資源的調(diào)用不同于對一個web service的調(diào)用。web服務(wù)調(diào)用框架(WSIF)遵循另外一種處理思路:在BPEL中使用相同的語法調(diào)用資源或服務(wù)并使用WSDL來描述,即使它是一個不通過SOAP協(xié)議通信的Java資源。WSIF也允許我們將這樣的服務(wù)和實際的實現(xiàn)與協(xié)議相映射。
          ??? 換句話說,我們可以把對抽象服務(wù)的描述與基于SOAP協(xié)議的實現(xiàn)綁定,與Java類綁定,與EJB綁定或者其它支持的資源,這只需要修改WSDL綁定即可。在BPEL中沒有代碼的更改是必須的而支持BPEL擴展也是需要的。對這種綁定的支持在由WSIF提供的支持者那里是堅定不移的。
          ?? WSIF是最初由IBM的WSTK (Web Services Toolkit)開發(fā)中alphaWorks部分發(fā)展而來的Apache技術(shù)。現(xiàn)在如Oracle BPEL Process Manager的一些BPEL服務(wù)器已經(jīng)支持WSIF。
          ?? 這兩種方法,BPELJ和WSIF都適合現(xiàn)實世界的場景并且使得BPEL在EAI和B2B中都非常有用。
          結(jié)束語
          ??? BPEL是面向過程轉(zhuǎn)向面向服務(wù)的一種重要語言。因為BPEL具體設(shè)計用來定義業(yè)務(wù)流程,因此對業(yè)務(wù)流程的很多特殊性有很好的支持,如長時間事務(wù),補償,事件管理,相關(guān)性等等。BPEL非常適合和J2EE平臺一起使用,很多BPEL服務(wù)器也是建立在J2EE之上的。結(jié)合BPEL和Java的BPELJ以及WSIF的思路使得BPEL的可用性越來越好。應(yīng)該看到正在制定的JBI(Java Business Integration)規(guī)范將會在JAVA平臺里給業(yè)務(wù)集成和BPEL一個更好的備有證明文件的位置。??
          ?


          地址:http://cauzcy.bokee.com/4749126.html

          posted on 2006-04-21 15:04 hopeshared 閱讀(2752) 評論(1)  編輯  收藏 所屬分類: Web Service

          Feedback

          # re: 轉(zhuǎn)載:BPEL和Java 2009-03-04 09:22 你老子
          cao ni lao mu  回復(fù)  更多評論
            

          主站蜘蛛池模板: 哈巴河县| 原平市| 德兴市| 读书| 房山区| 泰安市| 大石桥市| 龙海市| 高碑店市| 读书| 汾西县| 晋江市| 兴国县| 巴南区| 措勤县| 津南区| 抚宁县| 深泽县| 吴江市| 石泉县| 香港 | 和林格尔县| 儋州市| 资中县| 屏东市| 维西| 古丈县| 石嘴山市| 威信县| 宁远县| 诸城市| 平阳县| 桐庐县| 治县。| 运城市| 美姑县| 项城市| 河东区| 宣城市| 阳曲县| 南昌市|