BPEL中文教程_第1頁
BPEL中文教程_第2頁
BPEL中文教程_第3頁
BPEL中文教程_第4頁
BPEL中文教程_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、BPEL 實例教程面向 Web 服務(wù)的業(yè)務(wù)流程執(zhí)行語言(BPEL 或 BPEL4WS)是一種使用 Web 服務(wù)定義和執(zhí)行業(yè)務(wù)流程的語言。BPEL 使您可以通過組合、編排和協(xié)調(diào) Web 服務(wù)自上而下地實現(xiàn)面向服務(wù)的體系結(jié)構(gòu) (SOA)。BPEL 提供了一種相對簡單易懂的方法,可將多個 Web 服務(wù)組合到一個新的復(fù)合服務(wù)(稱作業(yè)務(wù)流程)中。本文將介紹如何創(chuàng)建一個將一系列虛擬的、與旅行相關(guān)的 web 服務(wù)結(jié)合起來的示例業(yè)務(wù)流程,然后將其部署到 Oracle BPEL Process Manager 運行時環(huán)境。BPEL 背景知識首先,介紹一些背景知識。BPEL 基于 XML 和 Web 服務(wù)構(gòu)建;它

2、使用一種基于 Web 的語言,該語言支持 web 服務(wù)技術(shù)系列,包括 SOAP、WSDL、UDDI、Web 服務(wù)可靠性消息、Web 服務(wù)尋址、Web 服務(wù)協(xié)調(diào)以及 Web 服務(wù)事務(wù)。BPEL 代表了兩種早期工作流語言 - Web 服務(wù)流語言 (WSFL) 和 XLANG 的交匯。WSFL 由 IBM 基于有向圖概念設(shè)計。XLANG 是一種由 Microsoft 設(shè)計的塊結(jié)構(gòu)化語言。BPEL 組合了這兩種方法,并提供了豐富的詞匯來描述業(yè)務(wù)流程。BPEL 的第一個版本誕生于 2002 年 8 月。此后,隨著許多主要供應(yīng)商(包括 Oracle)的紛紛加入了,催生了多項修改和改進(jìn),并于 2003 年

3、3 月推出了 1.1 版。2003 年 4 月,BPEL 提交結(jié)構(gòu)化信息標(biāo)準(zhǔn)促進(jìn)組織 (OASIS) 以實現(xiàn)標(biāo)準(zhǔn)化,并組建了 Web 服務(wù)業(yè)務(wù)流程執(zhí)行語言技術(shù)委員會 (WSBPEL TC)。該努力使 BPEL 在業(yè)界獲得更廣范圍的認(rèn)可。在企業(yè)內(nèi)部,BPEL 用于標(biāo)準(zhǔn)化企業(yè)應(yīng)用程序集成以及將此集成擴(kuò)展到先前孤立的系統(tǒng)。在企業(yè)之間,BPEL 使與業(yè)務(wù)合作伙伴的集成變得更容易、更高效。BPEL 激發(fā)企業(yè)進(jìn)一步定義它們的業(yè)務(wù)流程,從而導(dǎo)致業(yè)務(wù)流程的優(yōu)化、重新設(shè)計以及選擇最合適的流程,進(jìn)而實現(xiàn)了組織的進(jìn)一步優(yōu)化。BPEL 中描述的業(yè)務(wù)流程定義并不影響現(xiàn)有系統(tǒng),因此對升級產(chǎn)生了促進(jìn)作用。在已經(jīng)或?qū)⒁ㄟ^

4、Web 服務(wù)公開功能的環(huán)境中,BPEL 是一項重要的技術(shù)。隨著 Web 服務(wù)的不斷普及,BPEL 的重要性也隨之提高。編制與編排Web 服務(wù)通常公開某些應(yīng)用程序或信息系統(tǒng)的操作。因此,組合多個 Web 服務(wù)實際上涉及基礎(chǔ)應(yīng)用程序及其功能的集成??梢杂脙煞N方式組合 Web 服務(wù):· 編制 · 編排在編制(通常用于專用業(yè)務(wù)流程)中,一個中央流程(可以是另一個 Web 服務(wù))控制相關(guān)的 Web 服務(wù)并協(xié)調(diào)對操作所涉及 Web 服務(wù)的不同操作的執(zhí)行。相關(guān)的 Web 服務(wù)并不“知道”(也無需知道)它們參與了組合流程并在參與更高級別的業(yè)務(wù)流程。只有編制的中央?yún)f(xié)調(diào)員知道此目標(biāo),因此編制主

5、要集中于操作的顯式定義以及 Web 服務(wù)的調(diào)用順序。(見圖 1。)圖 1:通過編制組合 Web 服務(wù)而編排并不依賴某個中央?yún)f(xié)調(diào)員。相反,編排所涉及的每個 Web 服務(wù)完全知道執(zhí)行其操作的時間以及交互對象。編排是一種強調(diào)在公共業(yè)務(wù)流程中交換消息的協(xié)作方式。編排的所有參與者都需要知道業(yè)務(wù)流程、要執(zhí)行的操作、要交換的消息以及消息交換的時間。(見圖 2。)圖 2:通過編排組合 Web 服務(wù)從組合 Web 服務(wù)以執(zhí)行業(yè)務(wù)流程的角度而言,編制是一個更靈活的范例,它相對于編排而言具有以下優(yōu)點:· 元件流程的協(xié)調(diào)由某個已知的協(xié)調(diào)員集中管理 · 可以組合 Web 服務(wù)而不必使它們知道它們正在

6、參與更大的業(yè)務(wù)流程 · 可以準(zhǔn)備其他方案以防發(fā)生故障。BPEL 支持兩種不同的業(yè)務(wù)流程描述方法(支持編制和編排):· 可執(zhí)行流程允許指定業(yè)務(wù)流程的準(zhǔn)確細(xì)節(jié)。它們遵循編制范例,并可由編制引擎執(zhí)行。 · 抽象業(yè)務(wù)協(xié)議允許只指定雙方之間的公共消息交換。它們不包含流程的內(nèi)部細(xì)節(jié)并且無法執(zhí)行。它們遵循編排范例?,F(xiàn)在,我們來逐步演示如何創(chuàng)建可執(zhí)行的 BPEL 業(yè)務(wù)流程;可以下載它的代碼并將其部署到 Oracle BPEL Process Manager。我們將假設(shè)已經(jīng)按照安裝指導(dǎo)成功安裝了 Oracle BPEL Process Manager,并假設(shè)它使用缺省端口 9700

7、。如果在安裝過程中選擇了其他端口,則必須相應(yīng)地修改示例。構(gòu)建業(yè)務(wù)流程BPEL 流程指定參與的 Web 服務(wù)的確切調(diào)用順序 - 順序地或并行地。使用 BPEL,您可以表述條件行為。例如,某個 Web 服務(wù)的調(diào)用可以取決于上次調(diào)用的值。還可以構(gòu)造循環(huán)、聲明變量、復(fù)制和賦予值、定義故障處理程序等。通過組合所有這些構(gòu)造,您可以以算法的形式定義復(fù)雜業(yè)務(wù)流程。實際上,由于業(yè)務(wù)流程本質(zhì)上屬于活動圖,因此使用統(tǒng)一建模語言 (UML) 活動圖表示它們可能很有用。通常情況下,BPEL 業(yè)務(wù)流程接收請求。為了滿足請求,該流程調(diào)用相關(guān)的 Web 服務(wù),然后響應(yīng)原始調(diào)用方。由于 BPEL 流程與其他 Web 服務(wù)通信,

8、因此它在很大程度上依賴于復(fù)合型 Web 服務(wù)調(diào)用的 Web 服務(wù) 的 WSDL 描述。我們來看一個示例。一個 BPEL 流程由多個步驟組成,每個步驟稱作“活動”。BPEL 支持基元活動和結(jié)構(gòu)活動。基元活動表示基本構(gòu)造,用于如下所示的常見任務(wù):使用 <invoke> 調(diào)用其他 Web 服務(wù) 使用 <receive>(接收請求)等待客戶端通過發(fā)送消息調(diào)用業(yè)務(wù)流程 使用 <reply> 生成同步操作的響應(yīng) 使用 <assign> 操作數(shù)據(jù)變量 使用 <throw> 指示故障和異常 使用 <wait> 等待一段時間 使用 <

9、terminate> 終止整個流程。然后,我們可以組合這些基元活動以及其他基元活動,以定義準(zhǔn)確指定業(yè)務(wù)流程步驟的復(fù)雜算法。為組合基元活動,BPEL 支持幾個結(jié)構(gòu)活動。其中最重要的是:順序 (<sequence>),它允許定義一組將按順序調(diào)用的活動。 流 (<flow>),用于定義一組將并行調(diào)用的活動 Case-switch 構(gòu)造 (<switch>),用于實現(xiàn)分支 While (<while>),用于定義循環(huán) 使用 <pick> 能夠選擇多個替換路徑之一。 每個 BPEL 業(yè)務(wù)還將使用 <partnerLink> 定

10、義合作伙伴鏈接,使用 <variable> 聲明變量。為了理解 BPEL 是如何描述業(yè)務(wù)流程的,我們將定義雇員出差安排的簡化業(yè)務(wù)流程:客戶端調(diào)用此業(yè)務(wù)流程,指定雇員姓名、目的地、出發(fā)日期以及返回日期。此 BPEL 業(yè)務(wù)流程首先檢查雇員出差狀態(tài)。我們將假設(shè)存在一個可用于進(jìn)行此類檢查的 Web 服務(wù)。然后,此 BPEL 流程將檢查以下兩家航空公司的機(jī)票價格:美國航空公司和達(dá)美航空公司。我們將再次假設(shè)這兩家航空公司均提供了可用于進(jìn)行此類檢查的 Web 服務(wù)。最后,此 BPEL 流程將選擇較低的價格并將出差計劃返回給客戶端。然后,我們將構(gòu)建一個異步 BPEL 流程。我們將假設(shè)用于檢查雇員出

11、差狀態(tài)的 Web 服務(wù)是同步的。由于可以立即獲取此數(shù)據(jù)并將其返回給調(diào)用方,因此這是一個合理的方法。為了獲取機(jī)票價格,我們使用異步調(diào)用。由于確認(rèn)飛機(jī)航班時刻表可能需要稍長的時間,因此這也是一個合理的方法。為簡化示例,我們假設(shè)以上兩家航空公司均提供了 Web 服務(wù),且這兩個 Web 服務(wù)完全相同(即提供相同的端口類型和操作)。在實際情形下,您通常無法選擇 Web 服務(wù),而是必須使用您的合作伙伴提供的服務(wù)。如果您有幸能夠同時設(shè)計 Web 服務(wù)和 BPEL 流程,則應(yīng)考慮用哪個接口更好。通常,您將對持續(xù)時間較長的操作使用異步服務(wù),而對在相對較短的時間內(nèi)返回結(jié)果的操作使用同步服務(wù)。如果使用異步 Web

12、服務(wù),則 BPEL 流程通常也是異步的。當(dāng)您用 BPEL 定義業(yè)務(wù)流程時,您實際上定義了一個由現(xiàn)有服務(wù)組成的新 Web 服務(wù)。該新 BPEL 復(fù)合 Web 服務(wù)的接口使用一組端口類型來提供類似任何其他 Web 服務(wù)的操作。要調(diào)用用 BPEL 描述的業(yè)務(wù)流程,則必須調(diào)用生成的復(fù)合 Web 服務(wù)。圖 3 是我們流程的示意圖。圖 3:出差安排示例 BPEL 流程在開發(fā)此示例 BPEL 流程的過程中,您將經(jīng)歷下列步驟:· 熟悉相關(guān)的 Web 服務(wù) · 為此 BPEL 流程定義 WSDL · 定義合作伙伴鏈接類型 · 開發(fā)此 BPEL 流程:定義合作伙伴鏈接聲明變

13、量編寫流程邏輯定義。第 1 步:列出相關(guān) Web 服務(wù)的清單在您開始編寫 BPEL 流程定義之前,必須先熟悉從業(yè)務(wù)流程中調(diào)用的 Web 服務(wù)。這些服務(wù)稱作合作伙伴 Web 服務(wù)。本示例使用雇員出差狀態(tài) Web 服務(wù)以及美國航空公司和達(dá)美航空公司 Web 服務(wù)(這兩個 Web 服務(wù)具有相同的 WSDL 描述)。(同樣,本示例中使用的 Web 服務(wù)是虛構(gòu)的。)雇員出差狀態(tài) Web 服務(wù)雇員出差狀態(tài) Web 服務(wù)提供 EmployeeTravelStatusPT 端口類型,通過它可以使用 EmployeeTravelStatus 操作檢查雇員出差狀態(tài)。此操作將返回雇員可以使用的乘機(jī)標(biāo)準(zhǔn)(可能為經(jīng)濟(jì)艙

14、、商務(wù)艙或頭等艙)。(見圖 4。)圖 4:雇員出差狀態(tài) Web 服務(wù)航空公司 Web 服務(wù)航空公司 Web 服務(wù)是異步的;因此它指定了兩個端口類型:第一個端口類型 FlightAvailabilityPT 用于使用 FlightAvailability 操作檢查航班可用性。為返回結(jié)果,該 Web 服務(wù)指定了第二個端口類型 FlightCallbackPT。此端口類型指定 FlightTicketCallback 操作。盡管航空公司 Web 服務(wù)定義了兩個端口類型,但它只實現(xiàn) FlightAvailabilityPT。FlightCallbackPT 則由作為 Web 服務(wù)客戶端的 BPEL 流

15、程實現(xiàn)。圖 5 是此 Web 服務(wù)體系結(jié)構(gòu)的示意圖:圖 5:航空公司 Web 服務(wù)第 2 步:為 BPEL 流程定義 WSDL接下來,我們必須將此業(yè)務(wù)出差 BPEL 公開為 Web 服務(wù)。因此,第二步是為它定義 WSDL。此流程將必須從它的客戶端接收消息并返回結(jié)果。它必須公開 TravelApprovalPT 端口類型,后者將指定一個輸入消息。它還必須聲明 ClientCallbackPT 端口類型(用于使用回調(diào)將結(jié)果異步返回給客戶端)。圖 6 說明了此流程。圖 6:此 BPEL 流程的 WSDL第 3 步:定義合作伙伴鏈接類型第三步是定義合作伙伴鏈接類型。合作伙伴鏈接類型表示 BPEL 流程

16、與相關(guān)方(包括 BPEL 流程調(diào)用的 Web 服務(wù)以及調(diào)用 BPEL 流程的客戶端)之間的交互。本示例包含三個不同的合作伙伴:客戶端、雇員出差狀態(tài)服務(wù)和航空公司服務(wù)。理想情況下,每個 Web 服務(wù)都應(yīng)在 WSDL 中定義相應(yīng)的合作伙伴鏈接類型。(實際情形可能不是這樣的。)然后,我們可以使用 WSDL 包裝合作伙伴 Web 服務(wù)(導(dǎo)入 Web 服務(wù)的 WSDL 并定義合作伙伴鏈接類型)?;蛘?,我們可以在 BPEL 流程的 WSDL 中定義所有合作伙伴鏈接。但由于此方法違反了封裝原則,因此不建議使用。對于本示例,我們定義了三個合作伙伴鏈接類型(每個類型位于 Web 服務(wù)的相應(yīng) WSDL 中):&#

17、183; travelLT:用于描述此 BPEL 流程客戶端與此 BPEL 流程本身之間的交互。此交互是異步交互。此合作伙伴鏈接類型在此 BPEL 流程的 WSDL 中定義。 · employeeLT:用于描述此 BPEL 流程與雇員出差狀態(tài) Web 服務(wù)之間的交互。此交互是同步交互。此合作伙伴鏈接類型在雇員 Web 服務(wù)的 WSDL 中定義。 · flightLT:描述此 BPEL 流程與航空公司 Web 服務(wù)之間的交互。此交互是異步交互,且航空公司 Web 服務(wù)對此 BPEL 流程調(diào)用一個回調(diào)。此合作伙伴鏈接類型在航空公司 Web 服務(wù)的 WSDL 中定義。每個合作伙伴

18、鏈接可以擁有一個或兩個角色,我們必須為每個角色指定它使用的 portType。對于同步操作,由于操作只是單向調(diào)用,因此每個合作伙伴鏈接類型僅有一個角色。例如,此 BPEL 流程對雇員出差狀態(tài) Web 服務(wù)調(diào)用 EmployeeTravelStatus 操作。由于它是同步操作,因此此 BPEL 流程等待完成并僅在完成操作后取得響應(yīng)。對于異步回調(diào)操作,我們必須指定兩個角色。第一個角色描述客戶端操作調(diào)用。第二個角色描述回調(diào)操作調(diào)用。在本示例中,BPEL 流程與航空公司 Web 服務(wù)之間存在一個異步關(guān)系。正如我們已經(jīng)指出的,我們需要三個合作伙伴鏈接類型:兩個鏈接類型指定兩個角色(因為它們是異步的),一

19、個鏈接類型指定一個角色(因為它是同步的)。合作伙伴鏈接類型在特殊命名空間/ws/2003/05/partner-link/ 的 WSDL 定義。首先,我們在客戶端使用的 BPEL 流程 WSDL 中定義 travelLT 鏈接類型以調(diào)用此 BPEL 流程。所需的第一個角色是出差服務(wù)(即,我們的 BPEL 流程)的角色??蛻舳耸褂?TravelApprovalPT 端口類型與此 BPEL 服務(wù)通信。第二個角色 travelServiceCustomer 描述了此 BPEL 流程將在 ClientCallbackPT 端口類型中對其執(zhí)行回調(diào)的客戶端

20、的特征:<plnk:partnerLinkType name="travelLT"><plnk:role name="travelService"><plnk:portType name="tns:TravelApprovalPT" /></plnk:role><plnk:role name="travelServiceCustomer"><plnk:portType name="tns:ClientCallbackPT" /&g

21、t;</plnk:role></plnk:partnerLinkType>第二個鏈接類型是 employeeLT。它用于描述此 BPEL 流程與雇員出差狀態(tài) Web 服務(wù)之間的通信,并在此雇員 Web 服務(wù)的 WSDL 中定義。此交互是同步交互,因此我們需要一個名為 employeeTravelStatusService 的角色。此 BPEL 流程使用雇員 Web 服務(wù)上的 EmployeeTravelStatusPT:<plnk:partnerLinkType name="employeeLT"><plnk:role name=&

22、quot;employeeTravelStatusService"><plnk:portType name="tns:EmployeeTravelStatusPT" /></plnk:role></plnk:partnerLinkType>最后一個合作伙伴鏈接類型 flightLT 用于描述此 BPEL 流程與航空公司 Web 服務(wù)之間的通信。此通信是異步通信。此 BPEL 流程對航空公司 Web 服務(wù)調(diào)用一個異步操作。此 Web 服務(wù)在完成請求后對此 BPEL 流程調(diào)用一個回調(diào)。因此,我們需要兩個角色。第一個角色描述航空

23、公司 Web 服務(wù)對于此 BPEL 流程服務(wù)的角色,即航空公司服務(wù) (airlineService)。此 BPEL 流程使用 FlightAvailabilityPT 端口類型進(jìn)行異步調(diào)用。第二個角色描述了此 BPEL 流程對于航空公司 Web 服務(wù)的角色。對于航空公司 Web 服務(wù)而言,此 BPEL 流程是一個航空公司客戶,因此角色名稱為 airlineCustomer。航空公司 Web 服務(wù)使用 FlightCallbackPT 端口類型進(jìn)行回調(diào)。此合作伙伴鏈接類型在航空公司 Web 服務(wù)的 WSDL 中定義:<plnk:partnerLinkType name="flig

24、htLT"><plnk:role name="airlineService"><plnk:portType name="tns:FlightAvailabilityPT" /></plnk:role><plnk:role name="airlineCustomer"><plnk:portType name="tns:FlightCallbackPT" /></plnk:role></plnk:partnerLinkType

25、>了解合作伙伴鏈接類型對于開發(fā) BPEL 流程規(guī)范至關(guān)重要。有時,它可以幫助生成所有交互的圖表。定義合作伙伴鏈接類型后,我們已經(jīng)完成了準(zhǔn)備階段,并準(zhǔn)備開始編寫業(yè)務(wù)流程定義。第 4 步:創(chuàng)建業(yè)務(wù)流程現(xiàn)在,您就可以開始編寫 BPEL 流程了。通常,BPEL 流程等待客戶端傳入的消息,以啟動業(yè)務(wù)流程的執(zhí)行。在本示例中,客戶端通過發(fā)送輸入消息TravelRequest 啟動此 BPEL 流程。然后,此 BPEL 流程通過發(fā)送 EmployeeTravelStatusRequest 消息調(diào)用雇員出差狀態(tài) Web 服務(wù)。由于此調(diào)用是同步調(diào)用,因此它等待 EmployeeTravelStatusRes

26、ponse 消息。然后,此 BPEL 流程通過向上述兩家航空公司 Web 服務(wù)發(fā)送 FlightTicketRequest 消息對它們進(jìn)行并發(fā)異步調(diào)用。每個航空公司 Web 服務(wù)通過發(fā)送 TravelReponse 消息進(jìn)行回調(diào)。然后,此 BPEL 流程選擇較合適的航空公司并使用 TravelResponse 消息對客戶端進(jìn)行回調(diào)。我們首先編寫一個空的 BPEL 流程提綱,它展示了每個 BPEL 流程定義文檔的基本結(jié)構(gòu):<process name="BusinessTravelProcess" . >   <partnerLinks&g

27、t;<!- The declaration of partner links -></partnerLinks><variables><!- The declaration of variables -></variables><sequence><!- The definition of the BPEL business process main body -></sequence></process>process/:<process name="BusinessT

28、ravelProcess" targetNamespace=" xmlns="/ws/2003/03/business-process/"xmlns:trv="xmlns:emp="xmlns:aln=" >.合作伙伴鏈接接下來,我們必須定義合作伙伴鏈接,它們定義與此 BPEL 流程交互的不同方。每個合作伙伴鏈接都與描述其特性的特定 partnerLinkType 相關(guān)。每個合作伙伴鏈接還最多指定兩個屬性:· myRole:表明業(yè)務(wù)流程本身的角色。 ·

29、; partnerRole:表明合作伙伴的角色。合作伙伴鏈接僅可以指定一個角色,通常同步請求/響應(yīng)操作也僅能指定一個角色。對于異步操作,它指定兩個角色。在本示例中,我們定義四個角色。第一個合作伙伴鏈接稱作客戶端,由 travelLT 合作伙伴鏈接類型描述其特性。此客戶端調(diào)用該業(yè)務(wù)流程。我們需要指定 myRole 屬性以描述此 BPEL 流程 (travelService) 的角色。我們必須指定第二個角色:partnerRole。此處,該角色為 travelServiceCustomer,它描述 BPEL 流程客戶端的特性。第二個合作伙伴鏈接稱作 employeeTravelStatus,由 e

30、mployeeLT 合作伙伴鏈接類型描述其特性。它是 BPEL 流程與 Web 服務(wù)之間的一個同步請求/響應(yīng)關(guān)系;我們再次僅指定一個角色。此時,該角色為 partnerRole,這是因為我們描述了 Web 服務(wù)(它是此 BPEL 流程的合作伙伴)的角色:最后兩個合作伙伴鏈接對應(yīng)于航空公司 Web 服務(wù)。由于它們使用同一類型的 Web 服務(wù),因此我們基于一個合作伙伴鏈接類型 flightLT 指定兩個合作伙伴鏈接。此處,由于我們使用異步回調(diào)通信,因此需要兩個角色。此 BPEL 流程 (myRole) 對于航空公司 Web 服務(wù)的角色為 airlineCustomer,而航空公司 (partner

31、Role) 的角色為 airlineService:<partnerLinks><partnerLink name="client" partnerLinkType="trv:travelLT"myRole="travelService"partnerRole="travelServiceCustomer"/><partnerLink name="employeeTravelStatus" partnerLinkType="emp:employeeLT&q

32、uot;partnerRole="employeeTravelStatusService"/><partnerLink name="AmericanAirlines" partnerLinkType="aln:flightLT"myRole="airlineCustomer"partnerRole="airlineService"/>            &

33、#160;      <partnerLink name="DeltaAirlines" partnerLinkType="aln:flightLT"myRole="airlineCustomer"partnerRole="airlineService"/></partnerLinks>變量 BPEL 流程中的變量用于存儲消息以及對這些消息進(jìn)行重新格式化和轉(zhuǎn)換。您通常需要為發(fā)送到合作伙伴以及從合作伙伴收到的每個消息定義一個變量。就我們的流程而

34、言,我們需要七個變量。我們將它們命名為 TravelRequest、EmployeeTravelStatusRequest、EmployeeTravelStatusResponse、FlightDetails、FlightResponseAA、FlightResponseDA 和 TravelResponse。我們必須為每個變量指定類型??梢允褂?WSDL 消息類型、XML 模式簡單類型或 XML 模式元素。在我們的示例中,我們對所有變量使用 WSDL 消息類型:<variables><!- input for this process ->  &#

35、160;   <variable name="TravelRequest" messageType="trv:TravelRequestMessage"/><!- input for the Employee Travel Status web service -><variable name="EmployeeTravelStatusRequest" messageType="emp:EmployeeTravelStatusRequestMessage"/>

36、<!- output from the Employee Travel Status web service -><variable name="EmployeeTravelStatusResponse" messageType="emp:EmployeeTravelStatusResponseMessage"/><!- input for American and Delta web services -><variable name="FlightDetails" messageType=

37、"aln:FlightTicketRequestMessage"/><!- output from American Airlines -><variable name="FlightResponseAA" messageType="aln:TravelResponseMessage"/><!- output from Delta Airlines -><variable name="FlightResponseDA" messageType="aln:Tr

38、avelResponseMessage"/><!- output from BPEL process -><variable name="TravelResponse" messageType="aln:TravelResponseMessage"/></variables>BPEL 流程主體流程主體指定調(diào)用合作伙伴 Web 服務(wù)的順序。它通常以 <sequence>(用于定義多個將按順序執(zhí)行的操作)開始。在順序中,我們首先指定啟動業(yè)務(wù)流程的輸入消息。我們使用 <receive>

39、 構(gòu)造(它等待匹配消息,在本示例中為 TravelRequest 消息)實現(xiàn)此目的。在 <receive> 構(gòu)造中,我們不直接指定消息。而是指定合作伙伴鏈接、端口類型、操作名稱以及可選變量(用于保存收到的消息以用于隨后的操作)。我們將消息接收與客戶端合作伙伴鏈接在一起,并等待對端口類型 TravelApprovalPT 調(diào)用 TravelApproval 操作。我們將收到的消息存儲到 TravelRequest 變量中:<sequence><!- Receive the initial request for business travel from client

40、 -><receive partnerLink="client" portType="trv:TravelApprovalPT" operation="TravelApproval" variable="TravelRequest"createInstance="yes" />. <receive> 等待客戶端調(diào)用 TravelApproval 操作,并將傳入的消息以及有關(guān)業(yè)務(wù)出差的參數(shù)存儲到 TravelRequest 變量中。此處,此變量名與消息名相同,但并不一

41、定要相同。接下來,我們需要調(diào)用雇員出差狀態(tài) Web 服務(wù)。但在調(diào)用之前,我們必須為此 Web 服務(wù)準(zhǔn)備輸入。查看雇員 Web 服務(wù)的 WSDL,可以看到我們必須發(fā)送由雇員部分組成的消息。我們可以通過復(fù)制客戶端發(fā)送的消息的雇員部分來構(gòu)造此消息。編寫相應(yīng)的賦值語句:.<!- Prepare the input for the Employee Travel Status Web Service -><assign><copy><from variable="TravelRequest" part="employee"

42、/><to variable="EmployeeTravelStatusRequest" part="employee"/></copy></assign>.現(xiàn)在,我們就可以調(diào)用雇員出差狀態(tài) Web 服務(wù)了。為了進(jìn)行同步調(diào)用,我們使用<invoke>  活動。我們使用 employeeTravelStatus 合作伙伴鏈接,并對 EmployeeTravelStatusPT 端口類型調(diào)用 EmployeeTravelStatus 操作。我們已經(jīng)在 EmployeeTravelStatusRe

43、quest 變量中準(zhǔn)備了輸入消息。由于它是同步調(diào)用,因此該調(diào)用等待回應(yīng)并將其存儲在 EmployeeTravelStatusResponse 變量中:.<!- Synchronously invoke the Employee Travel Status Web Service -><invoke partnerLink="employeeTravelStatus" portType="emp:EmployeeTravelStatusPT" operation="EmployeeTravelStatus"inputV

44、ariable="EmployeeTravelStatusRequest" outputVariable="EmployeeTravelStatusResponse" />.下一步是調(diào)用上述兩個航空公司 Web 服務(wù)。同樣,我們先準(zhǔn)備所需的輸入消息(這兩個 Web 服務(wù)的輸入消息相同)。FlightTicketRequest 消息包含兩部分:· flightData:它從客戶端消息 (TravelRequest) 中檢索而得。 · travelClass:它從 EmployeeTravelStatusResponse 變量中檢索

45、而得。因此,我們編寫一個包含兩個 copy 元素的賦值:.<!- Prepare the input for AA and DA -><assign><copy><from variable="TravelRequest" part="flightData"/><to variable="FlightDetails" part="flightData"/></copy><copy><from variable="Em

46、ployeeTravelStatusResponse" part="travelClass"/><to variable="FlightDetails" part="travelClass"/></copy></assign>.輸入數(shù)據(jù)包含需要傳遞給航空公司 Web 服務(wù)的數(shù)據(jù)。由于格式相同,因此我們可以使用一個簡單復(fù)制直接傳遞它。在實際情況下,通常需要執(zhí)行轉(zhuǎn)換。為此,可以使用具有 <assign> 的 XPath 表達(dá)式、使用轉(zhuǎn)換服務(wù)(如 XSLT 引擎)或使用由特定

47、BPEL 服務(wù)器提供的轉(zhuǎn)換功能?,F(xiàn)在,我們準(zhǔn)備調(diào)用這兩個航空公司 Web 服務(wù)。我們將進(jìn)行并發(fā)的異步調(diào)用。為表述并發(fā),BPEL 提供了 活動。對每個 Web 服務(wù)的調(diào)用將包含兩個步驟:使用 <invoke> 活動進(jìn)行異步調(diào)用。 使用 <receive> 活動等待回調(diào)。我們使用 <sequence> 對這兩個活動進(jìn)行分組。這兩個調(diào)用只在合作伙伴鏈接名稱上存在差別。我們對一個調(diào)用使用 AmericanAirlines,對另一個調(diào)用使用 DeltaAirlines。兩者均對 FlightAvailabilityPT 端口類型調(diào)用 FlightAvailabilit

48、y 操作,發(fā)送 FlightDetails 變量中的消息。 使用 <receive> 活動接收回調(diào)。我們再次使用這兩個合作伙伴鏈接名。<receive> 等待對 FlightCallbackPT 端口類型調(diào)用 FlightTicketCallback 操作。我們將結(jié)果消息分別存儲到 FlightResponseAA 和 FlightResponseDA 變量中:. <!- Make a concurrent invocation to AA in DA -> <f

49、low>        <sequence> <!- Async invoke of the AA web service and wait for the callback->          <invoke partnerLink="AmericanAirlines"

50、  portType="aln:FlightAvailabilityPT"  operation="FlightAvailability" inputVariable="FlightDetails" /> <receive partnerLink="AmericanAirlines"  portType="aln:FlightCallbackPT"  operation="FlightTicketCallback&

51、quot; variable="FlightResponseAA" /> </sequence> <sequence> <!- Async invoke of the DA web service and wait for the callback->          <invoke partnerLink=

52、"DeltaAirlines"  portType="aln:FlightAvailabilityPT"  operation="FlightAvailability" inputVariable="FlightDetails" /> <receive partnerLink="DeltaAirlines"  portType="aln:FlightCallbackPT"  operation="

53、;FlightTicketCallback" variable="FlightResponseDA" /> </sequence> </flow> .      在該流程的這個階段,我們收到兩個機(jī)票報價。在下一步中,我們必須選擇一個機(jī)票報價。為此,我們使用 <switch> 活動。 . <!- Select the best offer and construct the Tra

54、velResponse -> <switch>                <case condition="bpws:getVariableData('FlightResponseAA', 'confirmationData','/confirmationData/Price')  <= bpws:getVariableDat

55、a('FlightResponseDA', 'confirmationData','/confirmationData/Price')">                      <!- Select American Airlines -> <assign> <

56、copy> <from variable="FlightResponseAA" /> <to variable="TravelResponse" /> </copy> </assign> </case>                      <

57、otherwise> <!- Select Delta Airlines -> <assign> <copy> <from variable="FlightResponseDA" /> <to variable="TravelResponse" /> </copy> </assign> </otherwise> </switch> .  

58、60;    在 <case> 元素中,我們檢查美國航空公司的機(jī)票報價 (FlightResponseAA) 是等于還是低于達(dá)美航空公司的機(jī)票報價 (FlightResponseDA)。為此,我們使用 BPEL 函數(shù) getVariableData 并指定變量名。價格位于 confirmationData 消息的內(nèi)部,雖然它是唯一的消息部分,但我們?nèi)员仨氈付ㄋ?。我們還必須指定查詢表達(dá)式以找到價格元素。此處,我們采用簡單的 XPath 1.0 表達(dá)式。如果美國航空公司的機(jī)票報價低于達(dá)美航空公司的機(jī)票報價,則將 FlightResponseAA 變量復(fù)制到

59、 TravelResponse 變量(我們最終將此變量返回給客戶端)。否則,我們將復(fù)制 FlightResponseDA 變量。        我們已經(jīng)到達(dá)此 BPEL 業(yè)務(wù)流程的最后一步 使用 <invoke> 活動將回調(diào)返回給客戶端。對于此回調(diào),我們使用客戶端合作伙伴鏈接并對 ClientCallbackPT 端口類型調(diào)用 ClientCallback 操作。保存答復(fù)消息的變量為 TravelResponse: <!- Make a callback to the

60、 client -> <invoke partnerLink="client"  portType="trv:ClientCallbackPT"  operation="ClientCallback" inputVariable="TravelResponse" /> </sequence> </process>到此,我們已經(jīng)完成了我們的第一個 BPEL 業(yè)務(wù)流程規(guī)范。您可以看到,BPEL 并不是很復(fù)雜,并允許相對

61、簡單和自然的業(yè)務(wù)流程規(guī)范。第 5 步:部署和測試我們部署到 Oracle BPEL Process Manager 的每個 BPEL 流程都需要一個流程描述符。BPEL 標(biāo)準(zhǔn)不包括此流程描述符,且它特定于 BPEL 服務(wù)器。部署流程描述符是流程在給定平臺上的唯一實現(xiàn)部分,必須重寫它才能在不同 BPEL 引擎上運行該流程。Oracle 流程描述符是一個 XML 文件,它指定有關(guān) BPEL 流程的以下細(xì)節(jié):BPEL 源文件名、BPEL 流程名 (ID)、所有合作伙伴鏈接 WSDL Web 服務(wù)的 WSDL 位置以及可選的配置屬性。流程描述符的默認(rèn)文件名為 bpel.xml,但我們可以使用任何其他名稱:<BPELSuitcase><BPELProcess src="Travel.bpel" id="TravelProcessCh4"><partnerLinkBindings><partnerLinkBinding name="client"><property name="wsdlLocation">Travel.wsdl</property&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論