国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
業(yè)務(wù)流程: 學(xué)習(xí) BPEL4WS,第 3 部分各種活動(dòng)以及內(nèi)存中模型

最近發(fā)布的 Web 服務(wù)的業(yè)務(wù)流程執(zhí)行語(yǔ)言(Business Process Execution Language for Web Services,BPEL4WS)規(guī)范,其定位是成為整合方面的 Web 服務(wù)標(biāo)準(zhǔn)。本系列文章的目的是讓讀者對(duì) BPEL4WS 語(yǔ)言的不同組成部分有所了解,并教讀者如何創(chuàng)建自己完整的流程。本系列文章前面的部分對(duì)這種語(yǔ)言進(jìn)行了概述,并且引領(lǐng)讀者創(chuàng)建了他們的第一個(gè)簡(jiǎn)單的流程。這一部分將更詳細(xì)介紹每一種活動(dòng)。我們還將介紹如何在內(nèi)存中表示和操作各種 BPEL4WS 構(gòu)造。

介紹

既然我們已經(jīng)學(xué)習(xí)了 BPEL4WS 語(yǔ)言的基礎(chǔ)知識(shí)(請(qǐng)參閱 第 1 部分),并且我們已經(jīng)創(chuàng)建了一個(gè)簡(jiǎn)單的示例(請(qǐng)參閱 第 2 部分),那我們就來(lái)更詳細(xì)地研究如何使用每種活動(dòng)。在本文中,我們將提供對(duì)每個(gè) BPEL4WS 活動(dòng)的詳細(xì)描述。我們還將描述被 BPWS4J(IBM 的實(shí)現(xiàn),可以從 alphaWorks上獲得)用來(lái)表示 BPEL4WS 流程的內(nèi)存中表示,并給出一個(gè)示例解釋模型的使用。






基本活動(dòng)

基本活動(dòng)是與外界進(jìn)行交互最簡(jiǎn)單的形式。它們是無(wú)序的個(gè)別步驟,與服務(wù)進(jìn)行交互、操作傳輸數(shù)據(jù)或者處理異常。

Web 服務(wù)交互

流程可以用三種活動(dòng)與外界進(jìn)行交互: <invoke> 、 <reply><receive> 。和我們?cè)谇懊娴奈恼轮锌吹降囊粯?,流程的伙伴之間通過(guò)使用這三種活動(dòng)發(fā)生交互。通過(guò)指定 portType、操作以及伙伴,這些活動(dòng)中的每一種活動(dòng)標(biāo)識(shí)出它所屬于的 Web 服務(wù)調(diào)用。

流程用 <invoke> 活動(dòng)調(diào)用伙伴提供的 Web 服務(wù)。除了 portType、伙伴和操作之外,調(diào)用還為正被調(diào)用的操作的輸入和輸出指定輸入容器和輸出容器。調(diào)用可以是同步的(請(qǐng)求/響應(yīng)),也可以是異步的(單向)。在后一種情況中,只需要輸入容器。

業(yè)務(wù)流程通過(guò)一對(duì) <receive><reply> 活動(dòng)為它的伙伴提供服務(wù)。receive 表示流程提供的 WSDL 操作的輸入。如果流程需要向發(fā)送消息的伙伴返回一個(gè)應(yīng)答,那么 reply 活動(dòng)就是必需的。在流程中可以定義多個(gè) reply 活動(dòng)來(lái)回答該伙伴的調(diào)用;但是,一次只可能有一個(gè)匹配的 <reply> 成為激活的。適當(dāng)?shù)?reply 活動(dòng)的匹配是在運(yùn)行時(shí)進(jìn)行的,此時(shí)流程尋找這樣一個(gè)活動(dòng) ― 準(zhǔn)備運(yùn)行并擁有和 <receive> 相同的 portType、操作和伙伴。例如,流程可能將接收到的消息放在某個(gè)容器(容器 A)中,如果滿足某個(gè)條件就返回容器 A 中的消息,否則就返回來(lái)自另一個(gè)容器(容器 B)的消息。在這種情況下,receive 將具有兩個(gè)帶有該項(xiàng)條件的鏈接;這兩個(gè)鏈接將鏈接到兩個(gè) reply 活動(dòng),只有其中一個(gè) reply 活動(dòng)將激活并向伙伴返回正確的消息。

流程生命周期
只有當(dāng)一條消息被發(fā)送給特別標(biāo)記的 <receive> 活動(dòng)或 <pick> 活動(dòng)時(shí),才可能創(chuàng)建一個(gè)業(yè)務(wù)流程實(shí)例。幾個(gè) receive 活動(dòng)指出通過(guò)將 createInstance 屬性設(shè)置為真,它們就能夠創(chuàng)建一個(gè)流程實(shí)例。 <pick> 活動(dòng)將擁有一個(gè) onMessage 元素,這個(gè)元素也具有 createInstance 屬性并且被設(shè)置為真。在本文稍后的部分將更詳細(xì)地說(shuō)明 <pick> 活動(dòng)。第一個(gè)被這樣標(biāo)記并且獲得了一條消息的 receive 活動(dòng)將創(chuàng)建實(shí)例,接著,其余 receive 活動(dòng)在該實(shí)例中就被當(dāng)作常規(guī) receive 活動(dòng)來(lái)對(duì)待。

此時(shí),您可能想知道怎樣才能創(chuàng)建第二個(gè)實(shí)例。相關(guān)性用于弄清楚傳入的消息要發(fā)送給哪個(gè)實(shí)例。所有可以啟動(dòng)流程的 receive 和 onMessage 都必須擁有相同的相關(guān)性設(shè)置。所以,當(dāng)一條消息進(jìn)來(lái)的時(shí)候,流程對(duì)其進(jìn)行檢查以了解它是否包含與現(xiàn)有的實(shí)例相匹配的相關(guān)性設(shè)置。如果這條消息符合條件,流程就將它發(fā)送給那個(gè)實(shí)例。否則,流程將根據(jù)與傳入的消息的操作、portType 和伙伴信息相匹配的 receive 活動(dòng)創(chuàng)建一個(gè)新實(shí)例。在本系列以后的文章中將詳細(xì)討論 BPEL 中的相關(guān)性。

操作數(shù)據(jù): <assign> 活動(dòng)

<assign> 活動(dòng)可以用于將數(shù)據(jù)從一個(gè)容器復(fù)制到另一個(gè)容器,也可以用于通過(guò)使用表達(dá)式構(gòu)造和插入新數(shù)據(jù)。使用表達(dá)式主要是由于需要執(zhí)行簡(jiǎn)單的計(jì)算(如遞增序列號(hào))而激發(fā)的,這些簡(jiǎn)單計(jì)算是描述業(yè)務(wù)協(xié)議行為所必需的。表達(dá)式對(duì)消息選擇、屬性和文字常量進(jìn)行操作,以便為容器屬性或選擇產(chǎn)生新的值。

每個(gè) <assign> 活動(dòng)包含一個(gè)或多個(gè) <copy> 元素;每個(gè) <copy> 元素正好包含一個(gè) <from> 元素和一個(gè) <to> 元素。有各種形式的 <from> 元素和 <to> 元素,要記住的最重要的事情就是,從源( <from> )復(fù)制到目的地( <to> )的值必須是類(lèi)型兼容的。

一種較簡(jiǎn)單的 <from> 形式僅用名稱(chēng)指定容器。當(dāng)使用僅指定一個(gè)容器的源時(shí),將復(fù)制整個(gè)消息;這意味著目的地也必須僅指定一個(gè)容器。

更復(fù)雜一點(diǎn)的 <from> 形式指定一個(gè)容器以及該容器中的一個(gè)部件。當(dāng)使用這種形式時(shí),目的地也必須指定一個(gè)容器及其中的一個(gè)部件。

第三種形式的 <from> 指定要用 XPath 進(jìn)行求值的一般表達(dá)式。該表達(dá)式可以是 XPath 允許的任何東西,只要該表達(dá)式返回 XPath 值類(lèi)型(字符串、數(shù)值或布爾)。當(dāng)使用這種形式時(shí),目的地必須指定一個(gè)容器及其中的一個(gè)部件。

簡(jiǎn)而言之,消息可以覆蓋其他消息,消息部件可以覆蓋其他消息部件。因?yàn)楸磉_(dá)式不返回完整的消息,所以它們只被用于覆蓋消息部件。

因?yàn)橛斜匾?XPath 表達(dá)式能夠訪問(wèn)來(lái)自流程的信息,所以 BPEL4WS 引入了幾個(gè) XPath 擴(kuò)展函數(shù)。在標(biāo)準(zhǔn)的 BPEL4WS 名稱(chēng)空間 http://schemas.xmlsoap.org/ws/2002/07/business-process/中定義這些擴(kuò)展函數(shù),前綴 bpws與這個(gè)名稱(chēng)空間相關(guān)聯(lián)。

這些函數(shù)之一的一個(gè)示例如下所示。

                            bpws:getContainerData("containerName", "partName", "locationPath"?)                        

在這個(gè)示例中, containerName是容器的名稱(chēng), partName是該容器中一個(gè)部件的名稱(chēng), locationPath是這個(gè)指定部件中的絕對(duì)位置路徑,它是可選的。

任何希望檢索來(lái)自流程中某個(gè)容器的數(shù)據(jù)的 XPath 表達(dá)式都可以使用 bpws:getContainerData() 函數(shù),就好像它是內(nèi)置的 XPath 函數(shù)一樣。

:除了復(fù)制消息、部件和表達(dá)式外, <assign> 活動(dòng)還可以用于將服務(wù)引用復(fù)制到伙伴鏈接以及從伙伴鏈接復(fù)制服務(wù)引用。

其他基本活動(dòng)

在 BPEL4WS 中可以通過(guò) <throw> 活動(dòng)發(fā)出故障信號(hào)。為了使您能夠使用故障處理程序來(lái)最終捕獲故障并對(duì)其進(jìn)行處理,該語(yǔ)言要求故障有一個(gè)全局唯一的 QName??梢蕴砑右粋€(gè)可選的容器,該容器指向可以找到與故障相關(guān)的數(shù)據(jù)的位置。例如,您可能有一個(gè)發(fā)出某種故障的信號(hào)的 <throw> 活動(dòng),然后可以有一個(gè)具有 <reply> 的故障處理程序,該 <reply> 向伙伴發(fā)送關(guān)于故障的信息。該 reply 將使用故障活動(dòng)中指定的容器。

<terminate> 活動(dòng)可以用于立即放棄執(zhí)行著該終止活動(dòng)的業(yè)務(wù)流程實(shí)例中的所有執(zhí)行。

<wait> 活動(dòng)使流程能夠等待一段特定的時(shí)間間隔,或者一直等到某個(gè)截止期限為止。

<empty> 活動(dòng)什么都不做。如果您需要捕獲一個(gè)故障并抑制它,您可以使用這個(gè)活動(dòng)。






結(jié)構(gòu)化活動(dòng)

結(jié)構(gòu)化活動(dòng)規(guī)定了一組活動(dòng)發(fā)生的順序。結(jié)構(gòu)化活動(dòng)通過(guò)將業(yè)務(wù)流程執(zhí)行的基本活動(dòng)整合到結(jié)構(gòu)中來(lái)描述業(yè)務(wù)流程是如何被創(chuàng)建的,這些結(jié)構(gòu)表達(dá)了業(yè)務(wù)協(xié)議中所涉及的控制模式、數(shù)據(jù)流、故障和外部事件的處理以及在流程實(shí)例之間進(jìn)行消息交換的協(xié)調(diào)。

如同我們?cè)谶@個(gè)文章系列較早的文章中描述過(guò)的, <sequence> 活動(dòng)包含一個(gè)或多個(gè)順序執(zhí)行的活動(dòng)。活動(dòng)按照它們?cè)?<sequence> 元素中出現(xiàn)的順序被執(zhí)行。當(dāng) <sequence> 中的最后一個(gè)活動(dòng)已經(jīng)完成的時(shí)候, <sequence> 活動(dòng)本身就完成了。

<switch> 活動(dòng)起的作用與許多傳統(tǒng)編程語(yǔ)言中出現(xiàn)的 switch 構(gòu)造很相似。switch 活動(dòng)中有一個(gè)由 <case> 元素定義的、由一個(gè)或多個(gè)條件分支組成的有序列表,后面跟著一個(gè)可選的 <otherwise> 元素。每個(gè) <case> 分支指定一個(gè)布爾 XPath 表達(dá)式,按照表達(dá)式出現(xiàn)的順序?qū)λ鼈兦笾担l件表達(dá)式的求值所使用的邏輯,與前面講述 <assign> 的部分所描述的用于一般表達(dá)式的邏輯幾乎相同)。第一個(gè)布爾表達(dá)式值為真的 <case> 元素的子活動(dòng)將獲得執(zhí)行。如果沒(méi)有哪個(gè) <case> 元素的條件為真,則執(zhí)行 <otherwise> 元素的子活動(dòng)。如果沒(méi)有指定 <otherwise> 元素,則會(huì)有一個(gè)隱含的包含一個(gè) <empty> 活動(dòng)的 <otherwise> 。當(dāng)選定的分支完成時(shí), <switch> 活動(dòng)也就完成了。

<while> 活動(dòng)重復(fù)執(zhí)行它的子活動(dòng),直到對(duì)指定的布爾條件求得的值不再為真。條件被當(dāng)作 XPath 表達(dá)式進(jìn)行求值。

<pick> 活動(dòng)包含一組事件處理程序。每個(gè)處理程序包含一個(gè)活動(dòng),處理程序在 pick 已經(jīng)啟動(dòng)且處理程序正等待的事件發(fā)生時(shí)運(yùn)行。處理程序包括警報(bào)處理程序,警報(bào)處理程序指定持續(xù)時(shí)間或截止期限,還包括消息處理程序(onMessage),消息處理程序等待來(lái)自某個(gè)特定伙伴、portType 和操作三元組的消息。消息處理程序能夠按照與 receive 相同的方式創(chuàng)建一個(gè)流程實(shí)例,上面關(guān)于流程生命周期的部分描述了這種方式(使用 createInstance 屬性)。只有第一個(gè)要接收它的事件的事件處理程序才會(huì)運(yùn)行,一旦該處理程序的活動(dòng)完成, <pick> 就將完成。

<scope> 活動(dòng)為嵌套在其中的活動(dòng)提供故障處理功能和補(bǔ)償處理功能。在即將發(fā)表的關(guān)于故障處理和補(bǔ)償?shù)奈恼轮袑⒏敿?xì)地介紹作用域(scope)。

<flow> 構(gòu)造提供了以并行方式運(yùn)行活動(dòng)的能力,還提供了定義防護(hù)性鏈接的能力。它可以包含任意數(shù)量的活動(dòng)。當(dāng)流被啟動(dòng)后,這個(gè)流中的所有活動(dòng)就都做好了運(yùn)行的準(zhǔn)備,除非這些活動(dòng)具有還沒(méi)有求得值的傳入的鏈接。流定義了一組鏈接,這些鏈接的源活動(dòng)和目標(biāo)活動(dòng)都必須嵌套在這個(gè)流中。

鏈接對(duì)于如何將流程的活動(dòng)設(shè)置為運(yùn)行施加了自己的約束。一旦一個(gè)活動(dòng)完成了,它就對(duì)離它而去的鏈接上的任何條件進(jìn)行求值。如果沒(méi)有定義任何條件且活動(dòng)已經(jīng)正常完成,則所有條件的求值均為真。如果活動(dòng)發(fā)生了故障,或者無(wú)法運(yùn)行,那么活動(dòng)向它所有的外發(fā)鏈接報(bào)錯(cuò)。另一方面,有傳入鏈接的活動(dòng)不得不等待,直到獲得它所有鏈接傳下來(lái)的值,方可運(yùn)行。該活動(dòng)還需要對(duì)它所包含的活動(dòng)有控制權(quán)。例如,假設(shè)它是 sequence 中的第二個(gè)活動(dòng)并且它的所有鏈接都已傳入,如果該 sequence 中的第一個(gè)活動(dòng)尚未完成,那么它也不會(huì)運(yùn)行。一旦它擁有了這個(gè)控制權(quán)并且知道了它所有傳入的鏈接的值,它就對(duì)一個(gè)被稱(chēng)為連結(jié)條件的條件求值。連結(jié)條件包含傳入的鏈接的狀態(tài),如果活動(dòng)要運(yùn)行,則連結(jié)條件的求值必須為真。如果其求值為假,那么活動(dòng)將發(fā)出一個(gè)連結(jié)失敗的信號(hào)并且異常結(jié)束。如果該活動(dòng)的隱式鏈接(來(lái)自父活動(dòng)的控制權(quán))為真且活動(dòng)的各顯式鏈接中有任意一個(gè)為真,那么缺省連結(jié)條件就為真。所有的鏈接條件均為 XPath 表達(dá)式。






BPWS4J 模型

既然我們已經(jīng)更詳細(xì)地介紹了該語(yǔ)言,就讓我們看一看用于創(chuàng)建和表示 BPEL4WS 流程的內(nèi)存中表示的一種機(jī)制。我們稱(chēng)這組 API 為 BPWS4J 模型。這個(gè)“模型”包括一個(gè)工廠機(jī)制以及用來(lái)表示 BPEL4WS 構(gòu)造的所有接口。

應(yīng)用程序先通過(guò) BPWSFactory 的靜態(tài) newInstance 方法獲得一個(gè) BPWSFactory 實(shí)例。newInstance 方法使用下面有序的查找過(guò)程來(lái)確定要裝入的 BPWSFactory 實(shí)現(xiàn)類(lèi):

  • 檢查 com.ibm.bpws.factory.BPWSFactory 系統(tǒng)屬性。
  • 檢查 JRE 目錄下的 lib/bpws.properties 文件。鍵名與上面的系統(tǒng)屬性名稱(chēng)一樣。
  • 使用平臺(tái)缺省值(將隨實(shí)現(xiàn)而不同)。

 

:還有一個(gè)靜態(tài)的 newInstance 方法,它以工廠實(shí)現(xiàn)的全限定類(lèi)名作為參數(shù),這種情況不使用上述過(guò)程。

一旦獲得了一個(gè) BPWSFactory 實(shí)例,就可以調(diào)用方法 newBPWSProcess 來(lái)創(chuàng)建一個(gè)新 BPWSProcess。一旦獲得了那個(gè)流程,它就充當(dāng)一個(gè)可以用來(lái)創(chuàng)建將組成完整流程的其余項(xiàng)的工廠。

清單 1 是一個(gè)以編程的方式構(gòu)造包含一個(gè) <receive>/<reply> 序列的流程的示例:


清單 1. 構(gòu)造一個(gè) <receive>/<reply> 序列
                            BPWSFactory factory = BPWSFactory.newInstance();                        BPWSProcess process = factory.newBPWSProcess();                        String tns = "urn:echo:echoService";                        Containers containers = process.createContainers();                        Container container = process.createContainer();                        Partners partners = process.createPartners();                        Partner partner = process.createPartner();                        Sequence sequence = process.createSequence();                        Receive receive = process.createReceive();                        Reply reply = process.createReply();                        process.setName("echoString");                        process.setTargetNamespace(tns);                        partner.setName("caller");                        partner.setServiceLinkType(new QName(tns, "echoSLT"));                        partners.addPartner(partner);                        process.setPartners(partners);                        container.setName("request");                        container.setMessageType(new QName(tns, "StringMessageType"));                        containers.addContainer(container);                        process.setContainers(containers);                        receive.setName("EchoReceive");                        receive.setPartner(partner);                        receive.setPortType(new QName(tns, "echoPT"));                        receive.setOperation("echo");                        receive.setContainer(container);                        receive.setCreateInstance(Boolean.TRUE);                        sequence.addActivity(receive);                        reply.setName("EchoReply");                        reply.setPartner(partner);                        reply.setPortType(new QName(tns, "echoPT"));                        reply.setOperation("echo");                        reply.setContainer(container);                        sequence.addActivity(reply);                        sequence.setName("EchoSequence");                        process.setActivity(sequence);                        

由上面的序列步驟創(chuàng)建的內(nèi)存中表示應(yīng)該表示清單 2 中的流程。


清單 2. 序列步驟的內(nèi)存中模型
                            <process name="echoString"                        targetNamespace="urn:echo:echoService"                        xmlns:tns="urn:echo:echoService"                        xmlns="http://schemas.xmlsoap.org/ws/2002/07/business-process/">                        <partners>                        <partner name="caller"                        serviceLinkType="tns:echoSLT"/>                        </partners>                        <containers>                        <container name="request"                        messageType="tns:StringMessageType"/>                        </containers>                        <sequence name="EchoSequence">                        <receive name="EchoReceive"                        partner="caller" portType="tns:echoPT"                        operation="echo" container="request"                        createInstance="yes"/>                        <reply name="EchoReply"                        partner="caller" portType="tns:echoPT"                        operation="echo" container="request"/>                        </sequence>                        </process>                        

剛才闡述過(guò)的模式(將流程用作工廠,然后把構(gòu)造的項(xiàng)添加到適當(dāng)?shù)母疙?xiàng)中)用在整個(gè)內(nèi)存中模型中。

可以通過(guò)工具使用 BPWS4J 模型,也可以由那些想以編程的方式創(chuàng)建流程而不是讀或生成流程的用戶(hù)來(lái)使用 BPWS4J 模型。



在本系列的下一篇文章中,我們將講述如何使用 BPWS4J 可視化編輯器可視化地創(chuàng)建 BPEL 流程。其后的一篇文章將以我們已經(jīng)看到的貸款批準(zhǔn)樣本為基礎(chǔ),闡述鏈接和數(shù)據(jù)操作的使用。






參考資料






作者簡(jiǎn)介

Matthew J. Duftler 是 IBM T.J. Watson Research Center 的 Component Systems 小組的一名軟件工程師。他是 Apache SOAP 的原作者之一,是 JSR110(Java APIs for WSDL)的帶頭人之一,還是 IBM BPEL4WS 引擎的創(chuàng)作者之一。您可以通過(guò) duftler@us.ibm.com 與 Matthew Duftler 聯(lián)系。


 

Rania Khalaf 是 IBM TJ Watson Research Center 的 Component System 小組的一名軟件工程師。2001 年,她從 MIT 獲得學(xué)士學(xué)位和工程碩士學(xué)位后進(jìn)入 IBM。Rania 是 IBM BPEL4WS 引擎的創(chuàng)作者之一,您可以從 alphaWorks 上獲得 BPWS4J。您可以通過(guò) rkhalaf@watson.ibm.com與作者聯(lián)系。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
從UML到BPEL
SOA 案例研究,第 4 部分:業(yè)務(wù)流程場(chǎng)景
面向SOA企業(yè)業(yè)務(wù)過(guò)程建模的利器 — IT技術(shù)
一個(gè)BPEL的例子
過(guò)程組件模型
計(jì)算機(jī)世界網(wǎng)-周報(bào)全文-解讀業(yè)務(wù)流程管理
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服