面向服務(wù)的計(jì)算和web數(shù)據(jù)管理第8章 通過組合進(jìn)行面向服軟件開發(fā)_第1頁
面向服務(wù)的計(jì)算和web數(shù)據(jù)管理第8章 通過組合進(jìn)行面向服軟件開發(fā)_第2頁
面向服務(wù)的計(jì)算和web數(shù)據(jù)管理第8章 通過組合進(jìn)行面向服軟件開發(fā)_第3頁
面向服務(wù)的計(jì)算和web數(shù)據(jù)管理第8章 通過組合進(jìn)行面向服軟件開發(fā)_第4頁
面向服務(wù)的計(jì)算和web數(shù)據(jù)管理第8章 通過組合進(jìn)行面向服軟件開發(fā)_第5頁
已閱讀5頁,還剩140頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡介

面向服務(wù)的計(jì)算和web數(shù)據(jù)管理第8章通過組合進(jìn)行面向服軟件開發(fā)本章重點(diǎn)討論利用互聯(lián)網(wǎng)上可用的遠(yuǎn)程Web服務(wù),通過不同組合語言構(gòu)建應(yīng)用。我們將關(guān)注BPEL(業(yè)務(wù)流程執(zhí)行語言),并簡要介紹其他的企業(yè)軟件組合語言。在第9章,我們將詳細(xì)討論VPL(可視化編程語言),在第14章,我們將研究基礎(chǔ)設(shè)施即服務(wù)、平臺即服務(wù)、軟件即服務(wù)的云計(jì)算技術(shù)。

面向服務(wù)計(jì)算是一個范型,它包含了概念、方法和能夠?qū)崿F(xiàn)這些概念和方法的技術(shù)。圖8.1顯示了這些技術(shù)以及他們?nèi)绾伪唤M織在一個立方體中的。前面顯示了實(shí)現(xiàn)功能的技術(shù),而確??尚艑傩曰蚍?wù)質(zhì)量的技術(shù)則位于功能技術(shù)的后面。我們使用術(shù)語“服務(wù)質(zhì)量”表示用戶角度的質(zhì)量保證技術(shù),而同樣的技術(shù),從設(shè)計(jì)師的角度,我們則使用術(shù)語“可信屬性”。8.1組合語言概述圖8.1實(shí)現(xiàn)SOC技術(shù)的組織

圖8.2支持功能的SOC技術(shù)實(shí)例

第3章和第5章討論了如何用C#和.Net框架構(gòu)建一個基于遠(yuǎn)程Web服務(wù)的應(yīng)用。C#是一種強(qiáng)大的編程語言,使用這樣的語言和開發(fā)框架,需要嫻熟的編程功底。SOC的目標(biāo)之一是將應(yīng)用構(gòu)建與程序編寫相分離,這樣應(yīng)用構(gòu)建者不必是專業(yè)的程序員,而程序員也不必是業(yè)務(wù)領(lǐng)域?qū)<?。為了?shí)現(xiàn)這一目的,提出了許多應(yīng)用構(gòu)建或組合語言,如圖8.3所示。本章將介紹幾種組合語言和工具。

圖8.3組合語言和工具的演變根據(jù)協(xié)調(diào)風(fēng)格,組合語言可分為兩大類:編排和共同設(shè)計(jì)。

編排:一個中央過程,它本身可以是一個服務(wù),控制參與的服務(wù)并協(xié)調(diào)不同操作的執(zhí)行。在這種分割下,參與的服務(wù)只與應(yīng)用的中央過程通信。這對于使用獨(dú)立服務(wù)的私有業(yè)務(wù)過程是有用的。

共同設(shè)計(jì):沒中央?yún)f(xié)調(diào)者。每個參與的服務(wù)都可以與應(yīng)用中的多個合作伙伴通信。這對于涉及分布式服務(wù)協(xié)同設(shè)計(jì)的公有業(yè)務(wù)過程是有用的。

圖8.4是一個例子,說明了編排和共同設(shè)計(jì)的風(fēng)格差異。假定某商店需要發(fā)送一個對象給一家銀行,然而,該對象需要轉(zhuǎn)換為銀行可以閱讀的格式。因此,商店使用格式轉(zhuǎn)換服務(wù)。

圖8.4顯示編排和共同設(shè)計(jì)之間不同的例子編排:商店被看做是中央過程,商店發(fā)送對象給格式轉(zhuǎn)換服務(wù),由它進(jìn)行格式轉(zhuǎn)換。服務(wù)必須將轉(zhuǎn)換后的數(shù)據(jù)發(fā)送回商店。然后,商店將數(shù)據(jù)直接發(fā)送至銀行。如果商店不希望轉(zhuǎn)換服務(wù)知道數(shù)據(jù)的去向,那么這種風(fēng)格是合適的。

共同設(shè)計(jì):商店將對象以及銀行地址發(fā)送給轉(zhuǎn)換服務(wù),并告訴轉(zhuǎn)換服務(wù)將轉(zhuǎn)換后的數(shù)據(jù)發(fā)至銀行。顯然,這是將獲取數(shù)據(jù)送至銀行的一種更高效的方法。如果轉(zhuǎn)換服務(wù)是商店信賴的服務(wù),那么這種風(fēng)格是合適的。命令式、面向?qū)ο笠约懊嫦蚍?wù)的計(jì)算代表著不同的軟件開發(fā)方法。人們可以使用面向?qū)ο蟮木幊陶Z言編寫命令式程序。不過,最好是使用為支持特定計(jì)算而設(shè)計(jì)的語言。同樣,應(yīng)用組合的協(xié)作風(fēng)格可以用任何組合語言實(shí)現(xiàn)。然而,語言設(shè)計(jì)者通過實(shí)現(xiàn)特定的機(jī)制來支持特定的協(xié)作風(fēng)格,因此最好是選擇為某種協(xié)作風(fēng)格而設(shè)計(jì)的語言。表8.1列出了專門設(shè)計(jì)的以支持編排或共同設(shè)計(jì)的組合語言。表8.1編排和共同設(shè)計(jì)的組合方法

BPEL(業(yè)務(wù)流程執(zhí)行語言)是使用最為廣泛的組合語言,它得到面向服務(wù)軟件開發(fā)的大多數(shù)參與者的支持。8.2BPEL8.2.1BPEL活動和結(jié)構(gòu)

BPEL用來編寫可執(zhí)行的業(yè)務(wù)過程。BPEL包含一組活動和結(jié)構(gòu),類似于典型的程序語言中的活動和結(jié)構(gòu),如表8.2所示。表8.2BPEL活動和結(jié)構(gòu)8.2.2BPEL流程

BPEL是一種服務(wù)組合語言,用來定義基于現(xiàn)有服務(wù)的組合服務(wù)。雖然BPEL具有普通編程語言的基本結(jié)構(gòu),能夠編寫任何程序和服務(wù),但把BPEL用于這一目標(biāo)卻有諸多不便,因?yàn)樗狈?shù)據(jù)類型以及對數(shù)據(jù)類型的操作。

BPEL流程定義了Web服務(wù)間相互作用時的結(jié)構(gòu),所用術(shù)語如下:

(1)業(yè)務(wù)邏輯,包括數(shù)據(jù)、工作流以及錯誤處理和恢復(fù)機(jī)制;(2)參與的服務(wù)(伙伴),描述了伙伴的特征以及向伙伴會話提供的支持。

BPEL流程使用上述結(jié)構(gòu)和活動定義基于現(xiàn)有服務(wù)的組合Web服務(wù)。圖8.5顯示了一個BPEL流程的結(jié)構(gòu)、它的客戶以及提供BPEL流程所需要服務(wù)的三個服務(wù)。

圖8.5BPEL流程及它的客戶和服務(wù)BPEL流程開始于<receive>活動,該活動循環(huán)-等待由兩個字符串類型的消息組成的請求,兩個消息分別代表信用卡號和密碼。當(dāng)一個請求到達(dá)時,流程分配這兩個消息給兩個變量。然后,流程使用結(jié)構(gòu)<flow>允許兩個遠(yuǎn)程Web服務(wù)調(diào)用同時進(jìn)行(并行)。<invoke>活動有兩種模式:同步和異步。

(1)同步:創(chuàng)建一個雙向通信通道,其中調(diào)用者(客戶)阻塞并等待來自被調(diào)用者(服務(wù))的答復(fù)。

(2)異步:創(chuàng)建一個單向通信通道,允許調(diào)用者發(fā)送消息給被調(diào)用者。如果需要響應(yīng),被調(diào)用者必須使用<invoke>創(chuàng)建另外一個單向通道進(jìn)行回復(fù)。信用卡確認(rèn)和地址確認(rèn)這兩個服務(wù)都使用一個表示“有效”或“無效”的字符串來答復(fù)。根據(jù)收到的答復(fù),流程使用<switch>結(jié)構(gòu)(條件語句)來決定將什么消息回復(fù)給客戶。流程采用兩個<pick>結(jié)構(gòu)以確保信用卡號和地址都是有效的。然后,流程使用異步模式調(diào)用發(fā)貨服務(wù)。在這種模式下,流程不期望服務(wù)立即響應(yīng)。相反,流程給發(fā)貨服務(wù)提供一個端口(回調(diào)號碼),以供服務(wù)結(jié)束處理時進(jìn)行回調(diào)。在BPEL流程中,它用活動<receive>等待回調(diào)。

圖8.6刻畫了客戶、BPEL流程和服務(wù)之間的同步及異步通信,其中“調(diào)用-接收-調(diào)用-響應(yīng)”用于同步通信,而“調(diào)用-接收-調(diào)用-接收”用于異步通信。

圖8.6例子中的同步和異步通信8.2.3BPEL流程的WSDL接口定義

如果一個BPEL流程為其他客戶或服務(wù)至少提供一個訪問端口,這個流程本身就是一個Web服務(wù),因此它有WSDL接口定義,如圖8.7所示。

在通信活動中,當(dāng)<invoke>、<receive>和<reply>用于BPEL流程中時,必須指定一個通信合作伙伴。對于每一個合作伙伴,其鏈接類型需要在WSDL文件中定義。因此,除了標(biāo)準(zhǔn)WSDL文檔所具有的所有元素外,BPEL流程的WSDL接口還有一個額外的名為<partnerLinkType>的元素,它用來定義BPEL流程使用的伙伴連接的類型。

圖8.7BPEL流程和它的WSDL定義下面的WSDL文檔展示了圖8.5給出的BPEL流程的部分接口。

<?xmlversion="l.0"encoding="UTF8"?>

<definitions

xmlns:http="/wsdl/http/"

xmlns:soap="/wsdl/soap/"

xmlns:xs="/2001/XMLschema"

xmlns:soapenc="/soap/encoding/"xmlns="/wsdl/"

xmlns:targetNamespace="/share/services/bpel/"

xmlns:zip="http://www.webserviceX.Net/addressValidation/"

xmlns:bk="/CCValidation/"

xmlns:shp="/shippingService/"

xmlns:plnk="/ws/2003/05

/partnerlink/"><!ThecompleteWSDLfilecanbegeneratedbytool>

<types>

<xs:schema...>

</xs:schema>

</types>

<message...>

<part.../>

</message>

<portTypename="clientPT">

<operationname="transactionApproval"><inputmessage="transactionRequestMessage"/>

<outputmessage="transactionResponseMessage"/>

</operation>

</portType>

<portTypename="shippingCal1backPT">

<operationname="..."><inputmessage="..."/>

</operation>

</portType>

<!Definitionofthepartnerlinktypes><plnk:partnerLinkTypename="paymentShippingLT">

<plnk:rolename="paymentShippingService">

<plnk:portTypename="clientPT"/>

</plnk:role>

</plnk:partnerLinkType>

<plnk:partnerLinkTypename="CCValodationLT">

<plnk:rolename="CCValidator">

<plnk:portTypename="bk:CCCheckerSoap"/>

</plnk:role>

</plnk:partnerLinkType><plnk:partnerLinkTypename="AddrValidationLT">

<plnk:rolename="AddrValidator">

<plnk:portTypename="mov:USAddressVerificaitonSoap"/>

</plnk:role>

</plnk:partnerLinkType>

<plnk:partnerLinkTypename="shippingLT">

<plnk:rolename="shippingRequester">

<plnk:portTypename="shippingCallbackPT"/>

</plnk:role><plnk:rolename="shippingService">

<plnk:portTypename="shp:shippingServicePT"/>

</plnk:role>

</plnk:partnerLinkType>

</definitions>

在此WSDL定義中,定義了兩個端口類型。一個是clientPT,另一個是shipingCallbackPT。前者為客戶和BPEL流程(服務(wù))之間的同步通信定義了一個雙向接口。后者為發(fā)貨服務(wù)回調(diào)定義了一個單向(僅輸入)接口。端口類型是WSDL文檔的標(biāo)準(zhǔn)部件。在BPEL流程的WSDL文件中新定義的部件是partnerLinkType。如圖8.5所示,BPEL流程有四個合作伙伴,在上述文件中,定義了四個partnerLinkType,其中每一個都定義了在伙伴關(guān)系中具有端口類型的實(shí)體的角色。如果使用同步通信,涉及一個端口類型并且需要定義一種角色。如果使用異步通信,涉及兩個端口類型并且需要定義兩種角色:

(1)在客戶和BPEL流程的伙伴關(guān)系中,涉及一個端口類型,擁有端口類型的實(shí)體的角色是付款和發(fā)貨服務(wù)。(2)在BPEL流程和信用卡確認(rèn)的伙伴關(guān)系中,涉及一個端口類型,擁有端口類型的實(shí)體的角色是信用卡確認(rèn)。

(3)在BPEL流程和地址確認(rèn)的伙伴關(guān)系中,涉及一個端口類型,擁有端口類型的實(shí)體的角色是地址確認(rèn)。

(4)在BPEL流程和發(fā)貨服務(wù)的伙伴關(guān)系中,涉及兩個端口類型,擁有端口類型shippingCallbackPT的實(shí)體的角色是發(fā)貨服務(wù)請求者,而擁有端口類型shippingServicePT的實(shí)體,在shp名字空間中定義,是發(fā)貨服務(wù)供應(yīng)商。8.2.4BPEL流程

一旦在WSDL文件中定義了合作伙伴鏈接類型,我們就可以進(jìn)行BPEL流程本身的討論。下面代碼對應(yīng)于圖8.5給出的BPEL流程。代碼由幾個主要部分組成:

(1)第一部分定義了需要的名字空間。

(2)下一部分定義了每個合作伙伴的伙伴鏈接。該過程有四個合作伙伴,因此有四個合作伙伴鏈接。只要有端口類型的合作伙伴就需要定義伙伴鏈接的角色。因此,前三個合作伙伴鏈接有一個角色,而第四個鏈接有兩個角色。

(3)再下面的部分定義了需要存儲來自于Web服務(wù)以及傳送給Web服務(wù)的值的變量。它們在BPEL流程的作用類似于傳統(tǒng)編程語言中的變量聲明。

(4)BPEL流程的其余部分是主要的處理部分,相當(dāng)于Java或C#的main()方法。在此代碼中,過程使用順序結(jié)構(gòu)<sequence>接收輸入數(shù)據(jù),然后將數(shù)據(jù)復(fù)制給調(diào)用服務(wù)所需的變量。一旦數(shù)據(jù)準(zhǔn)備就緒,過程使用并行結(jié)構(gòu)<flow>同時調(diào)用兩個Web服務(wù)。最后,過程使用switch結(jié)構(gòu),基于真假值選擇下一步采取的動作。

<?xmlversion="1.0"encoding="utf8"?>

<processname="PaymentAndAddressValidation"

xmlns="http://schemas.xmlS/ws/2003/03/businessprocess/"

xmlns:bpws="/ws/2003/03/businessprocess/"

xmlns:zip="http://www.webservicex.Net/"

xmlns:ps="/share/services/bpel/ps.wsdl">

<!Definepartnerlinks>

<partnerLinks>

<partnerLinkname="client"partnerLinkType="ps:paymentShippingLT"

myRole="paymentShippingService"/>

<partnerLinkname="CCValidator"

partnerLinkType="ps:CCValodationLT"

partnerRole="CreditCardValidator"/>

<partnerLinkname="AddressValidator"

partnerLinkType="ps:AddressLT"

partnerRole="AddressValidator"/>

<partnerLinkname="ShippingService"

partnerLinkType="ps:shippingLT"myRole="shippingRequester"

partnerRole="shippingService"/>

</partnerLinks>

<!Definevariablestobeusedinthemainpart>

<variables>

<!inputforthisprocess>

<variablename="TransactionRequest"

messageType="client:TransactionRequestMessage"/>

<!inputfortheCreditCardValidationwebservice><variablename="CCValidationRequest"

messageType="ps:ValidateCCRequestMessage"/>

<!outputfromCreditCardValidaitonwebservice

<variablename="CCValidationResponse"

messageType="ps:ValidateCCResponseMessage"/>

<!inputforAddressValidationwebservice>

<variablename="AddressValidationRequest"

messageType="ps:AddressRequestMessage"/>

<!outputfromAddressValidationwebservice><variablename="AddressValidaitonResponse"

messageType="ps:AddressResponseMessage"/>

<!outputfromBPELprocess>

<variablename="TransactionResponse"

messageType="client:TransactionResponseMessage"/>

<variablename="ValidationFalse"type="xs:string"/>

</variables><!Themainmethod/partoftheprocess>

<sequence>

<!Receivetheinitialrequestforfromclient>

<receivepartnerLink="client"

portType="client:TransactionRequestPT"

operation="TransactionApproval"

variable="TransactionRequest"

createlnstance="yes"/>

<!PrepareinputfortheCCandAddressWS>

<assign>

<copy><fromvariable="TransactionRequest"part="CC"/>

<tovariable="CCValidaitonRequest"part="CC"/>

</copy>

</assign>

<assign><copy>

<fromvariable="TransactionRequest"part="Address"/>

<tovariable="AddressValidationRequest"part="Address"/>

</copy></assign>

<!SynchronouslyinvokeCC&AddressValidationServices>

<flow>

<invokepartnerLink="CCValidator"

portType="ps:CCCheckerSoap"

operation="ValidateCardNumber"

inputvariable="CCValidationRequest"

outputvariable="CCValidaitonResponse"/>

<invokepartnerLink="AddressValidator"

portType="ps:USAddressVerificationSoap"operation="VerifyAddress"

inputvariable="AddressValidationRequest"

outputvariable="AddressValidaitonResponse"/>

</flow>

<!selectthereturnvaluefromCCvalidation>

<switch>

<casecondition="bpws:getVariableData(′CCValidationResponse′,

′ps:string′)="true"ANDbpws:getVariableData(′AddressValidationResponse′,

′ps:string′)="true">

<!SelectValidationTrue>

<assign>

<copy>

<fromvariable="CCValidaitonResponse"/>

<tovariable="TransactionResponse"/>

</copy>

</assign><!SelectValidationFalse>

<otherwise>

<assign>

<copy>

<fromvariable="CCValidationResponse"/>

<tovariable="TransactionResponse"/>

</copy>

</assign>

</otherwise>

</case>

<!sendaresponsetotheclient><replypartnerLink="client"

portType="ps:clientPT"

operation="TransactionApproval"

variable="TransactionResponse"/>

</sequence>

</process>8.2.5一個調(diào)用實(shí)際的Web服務(wù)的例子

在上述討論中,我們使用了一個比較復(fù)雜的例子,因此我們可以接觸到BPEL流程和它的WSDL接口設(shè)計(jì)時的許多問題。然而,這個BPEL流程不是一個工作實(shí)例,因?yàn)檫@個例子中使用的Web服務(wù)是假想的,沒有可用于信用卡確認(rèn)和發(fā)貨的免費(fèi)服務(wù)使得這個例子成為真實(shí)的。在本節(jié),我們將給出一個小例子,但卻是一個可工作的例子,在該例子中,所有的服務(wù)都是真實(shí)的。圖8.8顯示了客戶、BPEL流程和在該例子中使用的兩個Web服務(wù)的框圖。兩個遠(yuǎn)程Web服務(wù)是:

(1)USZip服務(wù),它根據(jù)城市名稱返回美國的郵政編碼。實(shí)際的Web服務(wù)的WSDL定義在:(/uszip.asmx?wsdl);

(2)電影信息服務(wù),它根據(jù)郵政編碼和范圍檢索電影院和電影的名單。實(shí)際的Web服務(wù)的WSDL定義在(/webservices/ignyte.whatsshowing.webservice/moviefunctions.asmx?WSDL)。

BPEL流程提供了一個組合服務(wù),它允許客戶使用城市名稱檢索郵政編碼,然后使用郵政編碼檢索電影院和電影信息。

圖8.8一個基于城市名返回電影信息的BPEL流程BPEL流程有三個合作伙伴,因此,我們需要創(chuàng)建三個伙伴鏈接類型,如下面的代碼段所示,其中客戶與BPEL流程之間的通信是異步的,而BPEL流程和USZip、MovieInfo服務(wù)之間的通信是同步的。

<?xmlversion="l.0"encoding="UTF8"?>

<definitions

xmlns:http="/wsdl/http/"

xmlns:soap="/wsdl/soap/"xmlns:xs="/2001/XMLschema"

xmlns:soapenc="/soap/encoding/"

xmlns="/wsdl/"

xmlns:targetNamespace="/share/services/bpel/"

xmlns:zip="http://www.webservicex.Net/uszip.asmx/"

xmlns:ttr="/webservices/ignyte.whatsshowing.webservice/moviefunctions.asmx/"

xmlns:plnk="/ws/2003/05/partnerlink/">

<plnk:partnerLinkTypename="clientLT">

<plnk:rolename="movieService">

<plnk:portTypename="tns:movieInfoPT"/>

</plnk:role>

<plnk:rolename="clientCallback">

<plnk:portTypename="tns:clientCallbackPT"/>

</plnk:role></plnk:partnerLinkType>

<plnk:partnerLinkTypename="uszipLT">

<plnk:rolename="getInfobyCityService">

<plnk:portTypename="mov:USZipSoap"/>

</plnk:role>

</plnk:partnerLinkType>

<plnk:partnerLinkTypename="movieInfoLT">

<plnk:rolename="movieInfoService">

<plnk:portTypename="mov:MovieInformationSoap"/>

</plnk:role>

</plnk:partnerLinkType>…

下面給出了訪問真實(shí)Web服務(wù)USZip和MovieInfo的完整的BPEL流程代碼。此段代碼除了使用的是真實(shí)的Web服務(wù)之外,與付款和發(fā)貨例子有著類似的結(jié)構(gòu)和功能。

<processname="Theatre"

targetNameSpace="/bpel/travel/"

xmlns=http://schemas.xmlS/ws/2003/03/businessprocess/xmlns:bpws="/ws/2003/3/businessprocess/"

xmlns:mov="/share/services/bpel/"

xmlns:zip="http://www.webserviceX.Net"

xmlns:ttr="/whatsshowing">

<!Definepartnerlinks>

<partnerLinks>

<partnerLinkname="client"partnerLinkType="mov:clientLT"myRole="movieService"

partnerRole="movieServiceRequester"/>

<partnerLinkname="USZip"

partnerLinkType="mov:uszipLT"myRole="GetInfoByCityService"/>

<partnerLinkname="MovieInfo"

partnerLinkType="mov:movieInfoLT"myRole="GetTheatreService"/>

</partnerLinks>

<!Definevariablesforstoringinformation>

<variables><!inputforthisprocess>

<variablename="MovieInfoRequest"

messageType="mov:MovieInfoRequestMessage"/>

<!inputfortheUSZipwebservice>

<variablename="GetInfoByCityRequest"

messageType="mov:GetInfoByCitySoapIn"/>

<!outputfromUSZipwebservice>

<variablename="GetInfoByCityResponse"

messageType="mov:GetInfoByCitySoapOut"/>

<!inputforMovieInfowebservices><variablename="GetTheaterRequest"

messageType="mov:GetTheatersAndMoviesSoapIn"/>

<!outputfromMovieInfowebservices>

<variablename="GetTheaterResponse"

messageType="mov:GetTheatersAndMoviesSoapOut"/>

<!outputfromBPELprocess>

<variablename="MovieInfoResponse"

messageType="mov:MovieInfoResponseMessage"/></variables>

<!Definethemainmethodtoprocesstheinformation>

<sequencename="main">

<!Receivetheinitialrequestfromclient>

<receivepartnerLink="client"

portType="mov:MovieInfoPT"

operation="MovieInfoFinder"

variable="MovieInfoRequest"

createlnstance="yes"/><!PrepareinputfortheUSZipWebservice>

<assign>

<copy>

<fromvariable="MovieInfoRequest"/>

<tovariable="GetInfoByCityRequest"part="parameters"/>

</copy>

</assign>

<!synchronouslyinvokeUSZipWebService>

<invokepartnerLink="employeeTravelStatus"portType="mov:USZipSoap"

operation="GetInfoByCity"

inputvariable="GetInfoByCityRequest"

outputvariable="GetInfoByCityResponse"/>

<!PreparetheinputforMovieInfoWS(Copyzipcode;

Radiusisalways5mile)intheexample>

<assign>

<copy>

<fromvariable="GetInfoByCityResponse"

part="parameters"query="zip:Table/zip:ZIP"/>

<tovariable="GetTheaterRequest"

part="parameters"query="/zipCode"/>

</copy>

<copy>

<fromexpression="5"/>

<tovariable="GetTheaterRequest"

part="parameters"query="/radius"/>

</copy>

</assign>

<!SynchronouslyinvokeMovieInfoWS><invokepartnerLink="MovieInfo"

portType="mov:MovieInformationSoap"

operation="GetTheatersAndMovies"

inputvariable="GetTheaterRequest"

outputvariable="GetTheaterResponse"/>

<!prepareBPELoutputMovieInfoRespose(referslide:7)>

<assign><copy>

<fromvariable="GetTheaterRespose"/>

<tovariable="MovieInfoResponse"/>

</copy></assign>

<!invokeclientcallback>

<invokename="CallbackClient"partnerLink="Client"

portType="mov:ClientCallbackPT"

operation="ClientCallback"

variable="MovieInfoResponse"/>

</sequence>

</process>

圖8.9BPEL流程和客戶端口類型定義到目前為止,我們已經(jīng)討論了BPEL流程的主要特征,包括活動、結(jié)構(gòu)和合作伙伴鏈接。與編程語言一樣,BPEL提供了許多其他特征。下面的代碼框架顯示了BPEL流程的一般結(jié)構(gòu),包括變量聲明、更正和支持事件驅(qū)動計(jì)算的各種處理。

圖8.10BPEL流程使用的Web服務(wù)的端口類型定義<process...>

<partnerLinks>...</partnerLinks>

<!eachaccessesaWebserviceofapredefinedpartnerLinkType>

<variables>...</variables>

<variable.../>

<variable.../>

<!Declareglobalvariablestobeusedbytheactivities><correlations>...</correlations>

<!Supportstatefulinteractionsbetweenprocessandservice>

<faultHandlers>...</faultHandlers>

<!Alternateexecutionpathtodealwithexceptions>

<compensationHandlers>...</compensationHandlers>

<!handlersthatundoactionsafterexceptions><!Activitiesandconstructsarecombinedandnestedto>

<!implementthemainbusinesslogic,suchas:>

<sequence>...</sequence>

<flow>...</flow>

<receive>...</receive>

<invoke>...</invoke>

<reply>...</reply>

</process>代碼框架中的變量定義,定義了作用域?yàn)檎麄€BPEL流程的全局變量。BPEL也支持在某一結(jié)構(gòu)內(nèi)定義的局部變量,用一對<scope>標(biāo)簽引用,如下面代碼片段所示:

<sequence>

<scope>

<variables>

<!Declarevariablelocaltothescope>

<variablename="MovieInfoRequest"messageType="mov:MovieInfoRequestMessage"/>

<!inputfortheUSZipwebservice>

<variablename="GetInfoByCityResponse"

messageType="mov:GetInfoByCitySoapOut"/>

</variables>

...

<assign>

<copy>

<fromvariable="MovieInfoRequest"/><tovariable="GetInfoByCityRequest"part="parameters"/>

</copy>

</scope><!Thescopeofabovelocalvariablesdonotgobeyondthispoint>

...

</sequence>

在上面代碼框架中顯示的故障處理有著與傳統(tǒng)編程語言,如C++、C#和Java類似的結(jié)構(gòu),這可以從下面的代碼段看出。<process>

<partnerLinks>

</partnerLinks>

<variables>

</variables>

<faultHandlers>

<catchfaultName=‖CCValidationFailed‖>

<!Firstfaulthandler>

<!Performactivities></catch>

<catchfaultName=AddressValidationFailed‖>

<!Secondfaulthandler>

<!Performactivities>

</catch>

<catchAll>

<!Performactivities>

</catchAll>

</faultHandlers>

<!maincodeconsistsofconstructsandactivities>...

</process>

相關(guān)性是更復(fù)雜的主題,我們將在后面單獨(dú)的章節(jié)討論它。

在面向?qū)ο笥?jì)算中,當(dāng)創(chuàng)建一個對象后,我們可以在對象的數(shù)據(jù)域存儲數(shù)據(jù)并通過再次訪問相同的對象檢索數(shù)據(jù)。如果需要在同一個類的不同對象間維持其狀態(tài),那么可以在這個類中定義一個靜態(tài)數(shù)據(jù)域(變量)。然后,分配給程序的靜態(tài)內(nèi)存中的相同存儲位置將會被由相同類創(chuàng)建的所有對象訪問。然而,在Web服務(wù)中,使用的是不同的執(zhí)行模型。在服務(wù)后面的對象的數(shù)據(jù)域存儲信息是不可能的,也不能為客戶共享信息而創(chuàng)建靜態(tài)成員。8.3無狀態(tài)與有狀態(tài)Web服務(wù)當(dāng)客戶使用服務(wù)提供者網(wǎng)站上的遠(yuǎn)程類時,它使用遠(yuǎn)程引用實(shí)例化一個對象,該遠(yuǎn)程引用在客戶端創(chuàng)建一個代理或一個虛擬對象。代理是到提供者網(wǎng)站上運(yùn)行的服務(wù)的通道。許多客戶可以訪問相同的服務(wù)并且相同的客戶可以多次訪問相同的服務(wù)。對于訪問是否來自同一個客戶還是來自不同的客戶,服務(wù)通常不會區(qū)分或建立相關(guān)性。每當(dāng)一個請求到達(dá),一個服務(wù)的新實(shí)例(一個操作系統(tǒng)進(jìn)程)被創(chuàng)建;請求處理后,該實(shí)例終止。這就是所謂的無狀態(tài)服務(wù)。如圖8.11所示,盡管一個單一的代理被創(chuàng)建,但abs(x)方法被相同的客戶訪問兩次,需要創(chuàng)建兩個新的實(shí)例。當(dāng)PiValue()被訪問時,另一個實(shí)例被創(chuàng)建。圖8.11無狀態(tài)服務(wù)為每次訪問創(chuàng)建一個新實(shí)例無狀態(tài)服務(wù)是基于Web計(jì)算的自然簡單的解決方案。然而,在許多情況下,我們還需要有狀態(tài)的解決方案。例如,如果AddToCart服務(wù)被多次調(diào)用,客戶期望狀態(tài)信息橫跨多個訪問,以便多個項(xiàng)目可以添加到相同的購物車。

ASP.Net沒有明確支持有狀態(tài)的Web服務(wù)。開發(fā)人員必須建立自己的機(jī)制以識別服務(wù)的客戶并關(guān)聯(lián)他們多次訪問的狀態(tài)。8.3.1BizTalk的singleton對象方法

通過引入一個稱之為singleton的對象,微軟BizTalk支持有狀態(tài)Web服務(wù)的開發(fā)。如果調(diào)用來自相同的代理,singleton對象允許創(chuàng)建類的單一實(shí)例(對象)。只有第一次從代理調(diào)用時才會創(chuàng)建一個新對象,來自相同代理的所有后續(xù)請求將會指向早期創(chuàng)建的同一對象。這種方法需要一些基礎(chǔ)設(shè)施以支持這一機(jī)制。具體來說,支持singleton對象的類需要:

(1)維持一個指向?qū)ο蟮拇砹斜恚?/p>

(2)維持請求與之前創(chuàng)建的對象之間的關(guān)聯(lián)關(guān)系;

(3)如果允許再次登錄,則維持賬戶和與賬戶相關(guān)的狀態(tài)列表;當(dāng)有調(diào)用請求時,識別代理(會話信息)和賬戶(登錄)。

請注意,此設(shè)計(jì)用基礎(chǔ)設(shè)施設(shè)計(jì)復(fù)雜度來置換軟件設(shè)計(jì)復(fù)雜度。如果為每一個對象創(chuàng)建一個單一對象,那么軟件設(shè)計(jì)就很容易,但基礎(chǔ)設(shè)施就很復(fù)雜,因?yàn)樗枰S持與已創(chuàng)建對象對應(yīng)的客戶名單。8.3.2BPEL的相關(guān)性方法

BPEL流程可以模擬兩種類型的服務(wù):簡單的無狀態(tài)的服務(wù)和更復(fù)雜的有狀態(tài)的、長時間運(yùn)行的異步服務(wù)。支持有狀態(tài)服務(wù)的機(jī)制被稱為相關(guān)性,它是跟蹤一個或一組特定的業(yè)務(wù)合作伙伴間的會話信息的一種結(jié)構(gòu)。相關(guān)性把消息和會話與業(yè)務(wù)流程實(shí)例相匹配。

當(dāng)BPEL引擎接收到一個消息時,它查找可以處理該消息的流程(服務(wù))。有些消息引發(fā)一個新的流程實(shí)例被創(chuàng)建(無狀態(tài)),而其他消息則需要被發(fā)送到一個已運(yùn)行的流程(有狀態(tài))。如何識別一個現(xiàn)有的流程?我們通過比較相關(guān)集的內(nèi)容來識別它。相關(guān)集是一個消息共享的屬性的集合,它用來表示用于維持交互(或稱為會話)狀態(tài)的數(shù)據(jù)。在交互的BPEL流程中,相關(guān)集把到來的消息發(fā)送給服務(wù)器站點(diǎn)上正確的流程實(shí)例。

更確切地說,相關(guān)集是一個包含了交互狀態(tài)的業(yè)務(wù)數(shù)據(jù)域(“相關(guān)業(yè)務(wù)數(shù)據(jù)”)的集合,例如,“訂單號”或“客戶ID”。每個相關(guān)集被初始化一次,它的值在交互過程中不會改變。與partnerLinkType的定義類似,相關(guān)集是一個已命名的屬性集合,其中每一個屬性定義為一個WSDL擴(kuò)展元素。一個屬性被映射到WSDL消息類型的一個域上。因此,在消息實(shí)際交換中,可以發(fā)現(xiàn)每個屬性。典型的,一個屬性可以被映射到多個不同的消息類型,并在許多跨操作和端口類型的交互中執(zhí)行。下面的代碼是在業(yè)務(wù)流程中使用相關(guān)集的例子。

<receivepartner="client"operation="..."portType="ClientPT"container="...">

<correlations>

<correlationset="UserId"initiate="yes"/></correlations>

</receive>

<invokepartnerLink="Client"portType="ClientPT"

operation="PurchaseResponse"inputVariable="PO">

<correlations>

<correlationset="UserId"initiate="no"/>

</correlations>

</invoke>在上面的代碼中,輸入或輸出操作標(biāo)識了哪些相關(guān)集應(yīng)用于消息接收或發(fā)送。該集合被用于確保消息與適當(dāng)?shù)臓顟B(tài)交互相關(guān)。

元素<correlation>有一個屬性叫做initiate,它可以設(shè)置為三個不同的值:yes,join和no。

(1)yes意味著相關(guān)Web服務(wù)的活動在每次執(zhí)行時必須初始化相關(guān)集。如果相關(guān)集未被初始化,將使用被傳送或接收的消息值來初始化相關(guān)集。如果在Web服務(wù)活動執(zhí)行時,相關(guān)集已經(jīng)初始化,BPEL要求活動拋出一個錯誤:bpel:correlationViolation。(2)如果多個活動并發(fā)執(zhí)行,并且它們中的任何一個都能在執(zhí)行時初始化相關(guān)集,則初始化屬性值是join,這意味著如果相關(guān)集未初始化,必須有一個活動初始化相關(guān)集。如果相關(guān)集已被初始化并且違反了相關(guān)一致性約束,那么就必須拋出一個錯誤:bpel:correlationViolation。join對于多個初始化活動或任何多于一個的活動可能會初始化相關(guān)集的場景是有用的。

(3)當(dāng)initiate屬性設(shè)置為no或者沒有明確設(shè)置,相關(guān)活動不能初始化相關(guān)集。如果活動執(zhí)行時,相關(guān)集沒有被初始化,將會拋出一個錯誤:bpel:correlationViolation

如果相關(guān)集已初始化,但違反相關(guān)一致性約束,則必須拋出一個錯誤:

bpel:correlationViolation

相關(guān)集可以由消息傳送或消息接收來初始化。下面的例子采用了/wsbpel/2.0/wsbpelv2.0.html上的OASIS的文檔。在這個例子中,討論了買方流程和賣方流程,如圖8.12所示。

圖8.12兩個相關(guān)集被用于關(guān)聯(lián)訂購單和發(fā)貨單

定義兩個相關(guān)集并用于雙方的消息傳送。如下面的代碼所示,買方流程通過調(diào)用賣方的“PurchaseRequst”操作并設(shè)置相關(guān)集=“PurchaseOrder”來初始化通信。initiate屬性被設(shè)置為yes,因?yàn)樵摬僮鞒跏蓟藭挕H缓?買方等待賣方兩個可能響應(yīng)PurchaseResponse或PurchaseReject中的一個。在這兩種情況下,initiate屬性被設(shè)置為no,因?yàn)樵搶傩詰?yīng)該已被初始化。PurchaseResponse到達(dá)后,第二個相關(guān)集Invoice被初始化。

<invokepartnerLink="Seller"portType="SP:PurchasingPT"operation="PurchaseRequest"variable="PO">

<correlations>

<correlationset="PurchaseOrder"initiate="yes"/>

</correlations>

</invoke>.

..

<pick>

<onMessagepartnerLink="Seller"portType="SP:BuyerPT"

operation="PurchaseResponse"variable="POResponse"><correlations>

<correlationset="PurchaseOrder"initiate="no"/>

<correlationset="Invoice"initiate="yes"/></correlations>

...<!handletheresponsemessage>

</onMessage>

<onMessagepartnerLink="Seller"portType="SP:BuyerPT"

operation="PurchaseReject"variable="POReject"><correlations>

<correlationset="PurchaseOrder"initiate="no"/>

</correlations>.

..<!handletherejectmessage>

</onMessage>

</pick>

在賣家一方,流程使用<receive>活動接收訂單,如下面代碼所示。當(dāng)相關(guān)集第一次被賣家訪問時,使用相同的相關(guān)集名稱PurchaseOrder,并且initiate屬性設(shè)置為yes。一旦采購訂單被處理(代碼沒有給出),可能會出現(xiàn)兩種情況:給買家發(fā)送一個發(fā)貨單,接收訂貨,或者拒絕訂單。在這兩種情況下,相關(guān)集的initiate屬性設(shè)置為no,因?yàn)橄嚓P(guān)集已被初始化。

<receivepartnerLink="Buyer"portType="SP:PurchasingPT"

operation="PurchaseRequest"variable="PO">

<correlations>

<correlationset="PurchaseOrder"initiate="yes"/>

</correlations>

</receive>

...

<invokepartnerLink="Buyer"portType="SP:BuyerPT"operation="PurchaseResponse"inputVariable="POResponse">

<correlations>

<correlationset="PurchaseOrder"initiate="no"/>

<correlationset="Invoice"initiate="yes"/>

</correlations>

</invoke>

<invokepartnerLink="Buyer"portType="SP:BuyerPT"operation="PurchaseReject"inputVariable="POReject">

<correlations>

<correlationset="PurchaseOrder"initiate="no"/>

</correlations>

</invoke>

請注意,BPEL方法使軟件設(shè)計(jì)更加復(fù)雜,因?yàn)樗枰幸粋€設(shè)計(jì)得當(dāng)?shù)南嚓P(guān)集。然而,這并不需要改變基礎(chǔ)設(shè)施。這是與BizTalk方法的區(qū)別之處。

雖然BPEL是一種基于XML的語言,并且BPEL流程可以在文本中逐行編寫,但還是有許多支持拖曳式可視化開發(fā)的IDE(集成開發(fā)環(huán)境)。每項(xiàng)活動、服務(wù)和結(jié)構(gòu)放在框中,組合就是選擇所需要的框,并把他們鏈接起來。BPEL流程和WSDL接口可自動生成。本節(jié)將介紹三個廣泛使用的支持BPEL開發(fā)的IDE:OracleSOA套件、ActiveBPEL和BizTalk。8.4支持BPEL組合的框架8.4.1OracleSOA套件

OracleSOA套件是一整套用于構(gòu)建、部署和管理SOA軟件的服務(wù)基礎(chǔ)設(shè)施組件。它允許創(chuàng)建服務(wù),管理服務(wù)并將服務(wù)編制成組合應(yīng)用和業(yè)務(wù)流程。它支持系統(tǒng)組件的熱插拔,允許組織擴(kuò)展并升級它們的體系結(jié)構(gòu)。該系統(tǒng)可在如下地址下載:/technology/software/tech/soa/index.html。

OracleSOA套件包括基于不同業(yè)務(wù)需求的不同組件集:(1)OracleJDeveloper。它是一個IDE,支持BPEL流程的可視化開發(fā),創(chuàng)建流程的WSDL文檔,部署B(yǎng)PEL的Web服務(wù)到托管環(huán)境中。雖然Jdeveloper與OracleSOA套件的其他組件一起工作,但它必須單獨(dú)安裝。下載網(wǎng)站是:/technology/software/products/jdev/index.html。

(2)OracleBPELProcessManager。它提供托管JDeveloper開發(fā)的Web服務(wù)。它還提供UDDI注冊服務(wù)。在大多數(shù)情況下,JDeveloper和ProcessManager就構(gòu)成開發(fā)SOA應(yīng)用的環(huán)境。(3)OracleBusinessRules。它支持規(guī)則和策略的管理和執(zhí)行。該組件允許將存儲在文本文件中的規(guī)則和策略從代碼中分離出來。這些規(guī)則和策略可以在運(yùn)行時修改,并在下次訪問它們時執(zhí)行新的規(guī)則和策略。

(4)OracleEnterpriseServiceBus(ESB)。它提供了不同編程語言編寫的不同應(yīng)用模塊間的適配器。它的功能類似于CORBA開發(fā)環(huán)境中的ORB(對象請求代理)。它還執(zhí)行從XML文本到Web表示的XSLT的轉(zhuǎn)換。圖8.13顯示了用JDeveloper可視化開發(fā)BPEL流程的例子,其中,每個活動都是開發(fā)環(huán)境中的一個項(xiàng)(圖標(biāo)),可以拖放到設(shè)計(jì)面板,并且可以使用圖標(biāo)上的接口來鏈接活動?;谖谋镜腂PEL流程和WSDL定義,可以在IDE的工程文件集中找到。這個例子是網(wǎng)上書店的開發(fā)。流程基于AmazonWS和BNWS服務(wù)。圖的中心部分是BPEL流程,負(fù)責(zé)編制客戶的請求以及來自服務(wù)的返回值。

圖8.13使用Jdeveloper進(jìn)行可視化開發(fā)8.4.2ActiveBPEL

和OracleSOA組件類似,ActiveBPELEnterpriseSuite也包含一套組件,這套組件為BPELWeb服務(wù)提供了創(chuàng)建、測試、部署和執(zhí)行的可視化環(huán)境。ActiveBPEL可以直接從/infocenter/ActiveBPEL/v30/index.jsp下載。ActiveBPEL主要組件包括:

(1)ActiveBPELDesigner:功能類似于JDeveloper,支持可視化開發(fā)、仿真、測試和部署B(yǎng)PEL流程。使用設(shè)計(jì)器,通過選擇合作伙伴、服務(wù)和操作,以及定義數(shù)據(jù)如何在這些實(shí)體之間流動來建立流程。當(dāng)你組織流程編輯器上的圖標(biāo)時,ActiveBPEL自動構(gòu)建有效的BPEL(XML)文件。圖8.14顯示了用ActiveBPEL設(shè)計(jì)器開發(fā)的ActiveBPELBPEL流程,與ActiveBPEL網(wǎng)站上給出的流程相同。

圖8.14使用ActiveBPEL進(jìn)行可視化開發(fā)(2)AdministrationConsole:這是ActiveBPELDesigner的一個替代方案,它管理已經(jīng)部署了并運(yùn)行在ApacheTomcat服務(wù)器上的流程,并提供一個報警系統(tǒng)以及查找流程結(jié)束點(diǎn)。它還有進(jìn)行性能管理的引擎設(shè)置。

(3)ActiveBPELEngine:它管理流程,包括流程版本(有效/失效日期)、合作伙伴端的調(diào)用處理、重新建立合作伙伴和安全策略、流程異常管理。對于大多數(shù)ActiveBPEL企業(yè)應(yīng)用服務(wù)器,ActiveBPELEngine可以運(yùn)行在群集環(huán)境中。

(4)ApacheTomcat:這個組件提供了一個通用的(基于Java)托管服務(wù),類似于微軟的基于C#服務(wù)的IIS。8.4.3BizTalk

BizTalk內(nèi)嵌于.Net并作為.Net的一個附加組件,是微軟的業(yè)務(wù)流程管理(BPM)環(huán)境,用于開發(fā)異質(zhì)系統(tǒng)集成或所謂的企業(yè)應(yīng)用集成(EAI)。BPEL是它支持的組合語言之一。事實(shí)上,BizTalk最初的組合語言是Xlang??梢栽赬LANG中導(dǎo)入BPEL流程并執(zhí)行,另一方面,XLANG流程也可以導(dǎo)出BPEL流程。沒有供下載的BizTalk的免費(fèi)版本。與OracleSOASuite和ActiveBPEL類似,BizTalk用可視化工具開發(fā)業(yè)務(wù)流程。XLANG和BEPL代碼都可以從圖形化流程設(shè)計(jì)器中生成。圖8.15是BizTalk教程中給出的例子,該教程可在/enus/library/aa560110.aspx獲得。

圖8.15用BizTalk進(jìn)行可視化開發(fā)

在Web開發(fā)中,mashup是一個Web應(yīng)用,它將來自兩個或多個源的數(shù)據(jù)或功能組合成單一的集成應(yīng)用[維基百科]。mashup作為一種面向服務(wù)組合方法,可以使用多種資源類型,包括Web服務(wù)、服務(wù)、API和數(shù)據(jù)源,來構(gòu)成多個應(yīng)用,如圖8.16所示。多層mashup也是可能的,也就是說,mashupWeb數(shù)據(jù)可提供給另一個mashup站點(diǎn)。8.5Mashup用于Web應(yīng)用的組合有多種不同的mashup組合工具,包括GoogleAppEngine中的GoogleMashupEditor,Yahoo!Pipes:(/pipes/),Microsoft使用了Silverlight的Popfly:(/),JackBemashup工具(/products/index.php)和IBMmashup中心(http://www01./software/info/mashupcenter/)。

圖8.16Mashup圖8.17顯示了來自Zillow地產(chǎn)()的一個真實(shí)世界的應(yīng)用。mashup應(yīng)用將資產(chǎn)值列表與地圖服務(wù)結(jié)合。對于一個給定的地址,會產(chǎn)生給定地址及其周邊房屋的資產(chǎn)值。類似的mashup例子是,它將谷歌地圖與Craigslist分類數(shù)據(jù)相結(jié)合。

圖8.17資產(chǎn)值列表和地圖服務(wù)的mashupmashup的簡單版本是widget,它將一個單一數(shù)據(jù)源導(dǎo)向一個Web應(yīng)用而無需編程。圖8.18說明了widget和mashup之間的差異。有許多widget資源,例如Yahoo!(http://),Amazon(https:///WidgetSource/),Simile(http://www.simile),Pollen()和Airnow(http://)。

圖8.18mashup和widgets現(xiàn)在,使用Yahoo!Pipes開發(fā)一個mashup應(yīng)用,它將兩個數(shù)據(jù)源合并成一個單一Web站點(diǎn)。數(shù)據(jù)源是:

/bulletins/rss

/taxonomy/term/18/all/feed

可用幾個簡單步驟開發(fā)mashup。

步驟1:創(chuàng)建一個新管道。在瀏覽器打開Yahoo!Pipes站點(diǎn)(/pipes/)并點(diǎn)擊“創(chuàng)建一個管道”。你將被要求登錄到你的Yahoo賬戶。登錄后,你將被帶到Y(jié)ahoo!Pipes圖形編輯器,在那里可以開發(fā)你的mashup應(yīng)用。圖8.19顯示了可用的模塊和利用已有模塊開發(fā)的Pipe。

圖8.19使用Yahoo!Pipes的mashup組合步驟2:定義數(shù)據(jù)源。展開編輯器邊上的庫面板中的資源并把“FetchFeed”模塊拖放到畫布,輸入兩個數(shù)據(jù)源到URL框。它支持不同類型的數(shù)據(jù)源。請注意,當(dāng)你把“FetchFeed”模塊移進(jìn)畫布時,“Pipeoutput”會自動在畫布中產(chǎn)生。

步驟3:選擇運(yùn)算符。展開運(yùn)算符并把“Sort”運(yùn)算符拖放到畫布。使用item.title進(jìn)行排序并選擇升序。

其他可用的運(yùn)算符包括Count,Filter,Loop,Split,Subelement,Tail,Truncate,Union和WebService。WebService運(yùn)算符允許你通過提供Web服務(wù)的URL來使用Web服務(wù)。步驟4:輸出和調(diào)試。調(diào)試器面板顯示了當(dāng)前選擇的模塊產(chǎn)生的Pipe的內(nèi)容。要查看Pipe的最終輸出,應(yīng)該將產(chǎn)生最終輸出數(shù)據(jù)的模塊連接到“PipeOutput”模塊。

步驟5:鏈接。為了使Pipe工作,需要基于業(yè)務(wù)邏輯將模塊連接在一起。你可以拖動任何模塊的輸出終端到數(shù)據(jù)輸入模塊的輸入終端。編輯器將兼容終端橙色閃爍,以指示哪些連接是允許的。你可以懸停在任何模塊的終端去查看哪種類型的數(shù)據(jù)是終端期望發(fā)送或接收的。步驟6:保存和發(fā)布。一旦建立好Pipe,應(yīng)該保存它,這將會提示輸入Pipe名,也可以選擇發(fā)布Pipe,這將產(chǎn)生可由任何人訪問的URL。生成的URL是/pipes/?_id=f3f17fb7be9f5f19f17f31a24ac14032。

正如本章開始所說的,有許多組合語言。本節(jié)將給出一些主要組合語言,包括OWLS,SCA/SDO,WF和WSFL。8.6其他組合語言8.6.1OWLS

OWLS(服務(wù)的本體Web語言)的前身為DAMLS(服務(wù)的DARPA代理標(biāo)記語言)(/Submission/OWLS/)。它包括一套標(biāo)記語言結(jié)構(gòu),并以非二義化的形式描述了Web服務(wù)的屬性和能力。計(jì)算機(jī)可識別的形式為以下操作提供了支持:

(1)服務(wù)宣傳:

功能方面

非功能方面

使用流程模型的交互協(xié)議。

(2)服務(wù)發(fā)現(xiàn)(OWLS媒介),支持基于類別的發(fā)現(xiàn)。(3)組合(OWLS過程模型),支持分層規(guī)劃。

(4)調(diào)用(OWLS虛擬機(jī))。

(5)執(zhí)行和監(jiān)測。

OWLS是OWL(本體Web語言)的擴(kuò)充,OWL是一種本體描述語言。OWLS增加了過程結(jié)構(gòu)的描述,類似于BPEL中的結(jié)構(gòu),因此可以描述工作流程。作為本體語言,OWLS使用三個屬性聲明一個服務(wù):

(1)服務(wù)配置,它提供了一組屬性來描述抽象的輸入和輸出,包括屬性serviceName,hasParamter,hasPrecondition,hasResult,hasInput,hasOutput和hasProcess。(2)流程模型,它提供定義流程的組合結(jié)構(gòu),該流程類似于BPEL流程。

(3)服務(wù)基礎(chǔ):把服務(wù)配置文件中定義的抽象輸入和輸出轉(zhuǎn)換成有SOAP傳輸?shù)腤SDL接口,從而使OWLS服務(wù)與其他Web服務(wù)兼容。轉(zhuǎn)換層稱為服務(wù)基礎(chǔ)。

OWLS支持如下用于組合流程的結(jié)構(gòu):

(1)順序:按順序執(zhí)行的控制結(jié)構(gòu)列表。

(2)拆分:拆分流程是由可并發(fā)執(zhí)行的流程組件構(gòu)成的。當(dāng)所有組件都給出執(zhí)行時間時,拆分就結(jié)束。

(3)拆分+合并:拆分+合并是由具有同步機(jī)制的并發(fā)執(zhí)行的流程組件構(gòu)成的。當(dāng)所有的組建流程完成時,拆分+合并就結(jié)束。(4)任意順序:允許集合中一組流程組件以任意順序執(zhí)行,但不能并行也不能重疊,必須完成所有組件的執(zhí)行。

(5)選擇:它從給定的控制結(jié)構(gòu)集合中選擇某一個控制結(jié)構(gòu)執(zhí)行。集合中的任一個都可以被選擇。

(6)IfThenelse:這是一個控制結(jié)構(gòu),它具有屬性ifCondition,then和else分別處理不同的方面。

(7)迭代:該結(jié)構(gòu)體對于進(jìn)行多少次迭代、何時開始、何時終止或恢復(fù)不做任何假設(shè)。

(8)RepeatWhile和RepeatUntil:結(jié)構(gòu)一直重復(fù),直到條件為真或假為止。8.6.2SCA/SDO

作為IBM主要的面向服務(wù)軟件開發(fā)平臺,服務(wù)組件體系結(jié)構(gòu)(SCA)和服務(wù)數(shù)據(jù)對象(SDO)為許多不同的服務(wù)和數(shù)據(jù)源提供了一個統(tǒng)一的編程接口(/developerworks/offers/techbriefings/details/scasdo.html)。

SCA有四個主要組件:

(1)組裝模型:定義語言無關(guān)的組合應(yīng)用。與OracleSOASuite和RoboticsDeveloperStudio類似,SCA支持圖形化開發(fā)。然而,SCA不局限于特定的語言。它支持多種語言,包括BPEL、PHP、Java和C++。圖8.20顯示了使用圖形化開發(fā)組合SCA應(yīng)用的一個場景,每個組件使用不同的編程語言。

圖8.20SCA組合模型(2)客戶和實(shí)現(xiàn)規(guī)范:在不同的編程語言和組合語言中使用SCA。

(3)綁定規(guī)范:使用訪問方法。它支持標(biāo)準(zhǔn)的Web服務(wù)綁定規(guī)范、JavaMessageService(JMS)綁定規(guī)范和EnterpriseJavaBeans(EJB)綁定規(guī)范。

(4)策略框架:將代表安全、交易、會話和可靠消息傳遞的策略添加到系統(tǒng),并在條件、約束和規(guī)則列表中聲明。SCA對許多不同的服務(wù)和訪問方法提供了一個單一的接口。換句話說,你可以寫相同的代碼去訪問不同的服務(wù),這些服務(wù)可以是基于不同語言如C++和Java的Web服務(wù)、BPEL流程和本地或遠(yuǎn)程對象。它還提供了用單一的方法來處理通信協(xié)議如SOAP和其他消息傳遞系統(tǒng)如JMS。如果服務(wù)需要身份驗(yàn)證、加密或其他策略,則由SCA環(huán)境處理,用戶不需要在他們的代碼中處理這些。

服務(wù)數(shù)據(jù)對象為數(shù)據(jù)訪問提供了類似的統(tǒng)一解決方案。通過SDO,使用單一的界面與你的數(shù)據(jù)源通信,無論它是關(guān)系數(shù)據(jù)庫、XML文件、Web服務(wù)或其他數(shù)據(jù)源。SDO讓你使用單一的API而不用關(guān)心底層技術(shù)是什么。8.6.3工作流基礎(chǔ)和Silverlight

WF(工作流基礎(chǔ))是WinFX的一部分,WinFX是微軟VisualStudio2008和WindowsVista(或WindowsServer2008的)中的新的編程環(huán)境。WinFX包括三部分:WF,WCF(Windo

溫馨提示

  • 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

提交評論