版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年下半年四川遂寧市市直機(jī)關(guān)遴選(考調(diào))公務(wù)員和2025年度選調(diào)公務(wù)員50人備考題庫及答案詳解1套
- 2026四川成都理工大學(xué)考核招聘博士輔導(dǎo)員25人備考題庫有完整答案詳解
- 2026安徽安慶岳西鄉(xiāng)鎮(zhèn)公開選聘5人備考題庫及一套完整答案詳解
- 2026安徽安慶市人力資源服務(wù)有限公司招聘勞務(wù)派遣員工4人備考題庫及答案詳解1套
- 2026年合肥某事業(yè)單位招聘勞務(wù)派遣人員1人備考題庫及完整答案詳解
- 2025貴州興義市人民醫(yī)院引進(jìn)高層次、急需緊缺人才100人備考題庫有答案詳解
- 2026上半年云南事業(yè)單位聯(lián)考國土資源職業(yè)學(xué)院招聘39人備考題庫帶答案詳解
- 2025至2030中國智能座艙人機(jī)交互設(shè)計(jì)趨勢與用戶體驗(yàn)調(diào)研報告
- 浙江浙江大學(xué)醫(yī)學(xué)院附屬第二醫(yī)院2025年招聘392人筆試歷年參考題庫附帶答案詳解
- 浙江2025年浙江開化縣事業(yè)單位面向教育系統(tǒng)選調(diào)20人筆試歷年參考題庫附帶答案詳解
- 華電集團(tuán)企業(yè)介紹
- 2025年安徽省從村(社區(qū))干部中錄用鄉(xiāng)鎮(zhèn)(街道)機(jī)關(guān)公務(wù)員考試測試題及答案
- 2025年AI時代的技能伙伴報告:智能體、機(jī)器人與我們(英文版)
- 中國舞蹈知識常見考點(diǎn)測試卷
- 人力資源管理社會實(shí)踐調(diào)研報告
- 2025年醫(yī)保網(wǎng)絡(luò)安全自檢自查報告
- 制造企業(yè)總經(jīng)理年終總結(jié)
- 供應(yīng)室去污區(qū)工作總結(jié)
- 超高層建筑深基坑施工風(fēng)險動態(tài)評估體系研究
- 牙槽外科常見病例討論
- 藥品研發(fā)異常管理辦法
評論
0/150
提交評論