windows工作流活動(dòng)技術(shù)概覽_第1頁
windows工作流活動(dòng)技術(shù)概覽_第2頁
windows工作流活動(dòng)技術(shù)概覽_第3頁
windows工作流活動(dòng)技術(shù)概覽_第4頁
windows工作流活動(dòng)技術(shù)概覽_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、windows工作流活動(dòng)技術(shù)概覽發(fā)表日期:2008-3-23 i人部分金業(yè)應(yīng)用程序都包含開發(fā)人員和架構(gòu)師認(rèn)為町以通過工作流輕松自然表示的業(yè) 務(wù)流程。從根木上講,工作流是捕捉現(xiàn)實(shí)世界屮實(shí)體間的交互的程序。工作流等待來自外部 世界的促進(jìn)因索,而促進(jìn)因索卻可能需要相當(dāng)長的時(shí)間才能到來。作為即將推出的microsoft .net framework 3.0的重要組成部分,windows workflow foundation提供了編程模型和運(yùn)行時(shí)引擎,以便基于安裝了 .net framework 2.0或更高版 本的window平臺(tái)來構(gòu)建支持工作流的應(yīng)用程序,其最低運(yùn)彳了要求為windows xp s

2、ervice pack 2 (sp2)或 windows server 2003 從軟件的角度看,需要人為操作的多數(shù)是界步事件處理、狀態(tài)保持以及共享服務(wù)器可用 性。windows workflow foundation實(shí)際上支持任何涉及人為操作的情況。每一個(gè)工作流都是一個(gè)聲明程序,其中,每條程序語句都用稱為活動(dòng)的組件表示。關(guān)于 windows workflow foundation的最大誤區(qū)z在于將所有要素活動(dòng)都看成是順序相連或按 狀態(tài)機(jī)轉(zhuǎn)換和連。實(shí)際上,windows workflow foundation對(duì)執(zhí)彳亍模型進(jìn)行了活動(dòng)自動(dòng)控制 方面的虛擬化。這使您能編寫對(duì)以捕捉各種控制流模式的復(fù)合

3、活動(dòng),范圍包括多種連接和合 并、狀態(tài)機(jī)、圖形、序列、交叉存取和非木地退出等??傊?,它將使您能夠通過“高保真” 的復(fù)合活動(dòng)對(duì)存在于現(xiàn)實(shí)世界屮的控制流模式進(jìn)行建模。然而,windows workflow foundation提供了針對(duì)以下兩種模式的內(nèi)置活動(dòng):順序工作流和狀態(tài)機(jī)工作流。順序工作流有明確的開始和結(jié)束點(diǎn),從始至終,一步接一步,沿看一條可能的線路執(zhí)行。 狀態(tài)機(jī)工作流可以被表示為一纟r狀態(tài),每種狀態(tài)可能包括各種活動(dòng),并由事件觸發(fā)。您可以 定義初始和完成狀態(tài),并按照所冇定義的轉(zhuǎn)換過程逐個(gè)狀態(tài)地執(zhí)行,直至到達(dá)結(jié)束狀態(tài)。正如我所談到的,工作流的構(gòu)造塊就是活動(dòng)。構(gòu)造這樣一個(gè)工作流意味著將活動(dòng)進(jìn)行組

4、合以創(chuàng)建所需的模型來解決碰到的問題。雖然windows workflow foundation捉供了很多內(nèi) 置的活動(dòng),但依然可以通過自定義活動(dòng)對(duì)其進(jìn)行完全擴(kuò)展。了解“開箱即用”活動(dòng)的目標(biāo)和 功能對(duì)于充分理解該平臺(tái)的真實(shí)潛能十分要害。木期專欄將帶您瀏覽安裝windows workflow foundation runtime 和 visual studio 2005 designer 時(shí)涉及的標(biāo)準(zhǔn)t作流活動(dòng)?!伴_箱即用”活動(dòng)windows workflow foundation 是.net framework 3.0 (原先稱為 winfx?)的組成部 分。雖然它只是個(gè)測試版本,但我發(fā)現(xiàn)最新的c

5、ommunity technology preview (社區(qū)技 術(shù)預(yù)覽,ctp)版非常穩(wěn)定,許多公司正廣泛使用該版本開發(fā)應(yīng)用程序。因此,已經(jīng)出現(xiàn)大 量工具和自定義活動(dòng),一個(gè)基于新聞組和論壇(如)的有效的技術(shù)支持社區(qū)正口益發(fā)展壯大。假如您對(duì)工作流應(yīng)用程序感愛好,那么越早熟悉它越好。若要查找最新的卜載,請(qǐng)?jiān)L問windows workflow foundation<>安裝完畢后,啟動(dòng)visual studio 2005,打開一個(gè)visual basic?或c#工作流項(xiàng)目,査看工具箱中的內(nèi)容。根據(jù)您所 選擇的項(xiàng)目類型,工具箱可能如圖1屮所示的一種。工具箱中的內(nèi)容與您的選擇操作相關(guān),根據(jù)您

6、所選擇的工作流的類型會(huì)有不同。非凡是, 圖1左邊的工具箱還包含您創(chuàng)建狀態(tài)機(jī)工作流時(shí)所需的狀態(tài)活動(dòng)。右邊的工作箱窗口只包 含順序工作流的活動(dòng)。這紐預(yù)定義的活動(dòng)可根據(jù)目標(biāo)和預(yù)期的行為分為兒類。圖2顯示了 可能的分類:控制流、執(zhí)行、事件、web服務(wù)和狀態(tài)機(jī)。圖1工具箱里的工作流活動(dòng)(click the image for a smaller view)圖2控制流活動(dòng)治理圖形活動(dòng)執(zhí)行的順序。列表列出了實(shí)現(xiàn)循環(huán)的條件塊以及構(gòu)造。執(zhí)行活 動(dòng)包括多種構(gòu)造,這些構(gòu)造可終止或掛起工作流、引發(fā)異常、執(zhí)行內(nèi)部或外部代碼,或者主 成另一個(gè)工作流。多數(shù)工作流需要與主機(jī)環(huán)境同步一通常是windows forms應(yīng)用程序或

7、 asp.nct應(yīng)用程序。事件組中的活動(dòng)能使工作流停止以等待外部事件、處理接收的事件,或 只是在執(zhí)行下一步z前進(jìn)行等待。最后,web服務(wù)和狀態(tài)組將目標(biāo)鎖定在工作流的兩種非 凡功能一將內(nèi)部引擎為公開為web服務(wù)或公開為狀態(tài)機(jī)。讓我們檢查一下框架中的主要 活動(dòng),然后分組進(jìn)行。通過條件控制工作流假如在工作流中指定了條件,運(yùn)行時(shí)引擎將對(duì)條件進(jìn)行計(jì)算,然后根據(jù)計(jì)算結(jié)果進(jìn)行操 作。兩種基丁條件的核心活動(dòng)是ifelse和policyo ifelse活動(dòng)的執(zhí)行方式如同高級(jí)編程語 言中的一條典型的if語句。它可以包含任意多基于條件的分支,以及一個(gè)在其他條件不滿 足情況卜執(zhí)行的默認(rèn)分支。而policy活動(dòng)表示一系

8、列規(guī)則。在windows workflow foundation屮,一條規(guī)則包括一個(gè)條件以及一個(gè)或一個(gè)以上引發(fā)的操作??梢詫⒁?guī)則看作 if-thcn-elsc語句,其中條件對(duì)應(yīng)if塊的boolean臨界條件,操作定義了 then和else子 句。讓我們進(jìn)一步了解各個(gè)活動(dòng),然后對(duì)它們進(jìn)行比較。當(dāng)被添加到一個(gè)工作流中時(shí),ifelse活動(dòng)看起如圖3所示。默認(rèn)情況卜:它有兩個(gè)分 支,可以通過右鍵單擊并從上下文菜單中進(jìn)行選擇來添加新的分支。當(dāng)運(yùn)行吋引擎達(dá)到一個(gè) ifelse活動(dòng),它開始計(jì)算從左至右進(jìn)行的各分支的條件。各分支的條件被確定,第一個(gè)計(jì)算 結(jié)果為“true”的分支被運(yùn)行。您可以通過活動(dòng)的上下文菜

9、單屮的命令往返移動(dòng)分支以更改 分支的計(jì)算順序。要啟用分支,需要指定有效的條件。您可以采用以下兩種方法中的一種來 指定條件:通過表達(dá)式或通過一段代碼。圖 3 ifelse 的實(shí)際活動(dòng)(click the image for a larger view)假如您選擇使用表達(dá)式來指定條件,則要在設(shè)計(jì)器設(shè)置分支,并為visual studio 2005 的“屬性”框中的“條件”項(xiàng)提供一個(gè)公共存放位置。接下來,打開表達(dá)式編輯器,輸入一 個(gè)涉及工作流成員并幾其計(jì)算值為布爾值的表達(dá)式。例如,假如工作流類具有名為 minimumlength的公共屬性,您可以將條件設(shè)置如下:this.minimumlcngth

10、>= 8圖4所示的編輯器完全支持intellisense?并提供對(duì)工作流私有成員和公共成員的訪 問。這意味著您也可以調(diào)用boolean兩數(shù)。假設(shè)您有一個(gè)屬性聲明如卜:public property minimumlength() as integergetreturn _minlengthend getset(byval value as integer)_minlength = valueend setend property圖 4 針對(duì) ifelsc 活動(dòng)的 condition editor(click the image for a larger view)當(dāng)您試圖讀取minimu

11、mlength的值時(shí),運(yùn)行時(shí)會(huì)結(jié)朿調(diào)用屬性的get存取器。該存 取器能夠回復(fù)私有成員.minlength的值。ifelsc活動(dòng)中的最后分支町以沒有條件。在這種 情況下,它將作為if工作流語句的else分支。指定條件的第二種方法是通過臨吋代碼。在這種情況下,您可以為工作流類添加方法, 例如:sub evalcondition(byval sender as object, by vai e as conditionaleventargs)e.result =' boolean valueend sub該函數(shù)必須與接受対象和conditionaleventargs類并回復(fù)void的簽名相匹

12、配。 conditionaleventargs類的result成員將設(shè)登為布爾值,代表?xiàng)l件的計(jì)算結(jié)果。ifelsc活動(dòng)可以進(jìn)行嵌套以表示復(fù)雜的邏輯,但邏輯的設(shè)計(jì)仍然要在工作流中進(jìn)行硬編 碼。這種方法既有利也有弊。有利的一面在于它使您可以根據(jù)您的需求準(zhǔn)確設(shè)計(jì)工作流并將 其與其他活動(dòng)整合。當(dāng)您需要?jiǎng)?chuàng)建一組規(guī)則來初始化部分工作流狀態(tài)時(shí),其不利的一面就顯 現(xiàn)出來。讓一連串ifelse活動(dòng)僅僅為工作流的內(nèi)部成員分配值顯然有些矯枉過正。當(dāng)您真正需要控制工作流的流動(dòng)并連接各種工作塊時(shí),您應(yīng)該使用ifelse活動(dòng)組合。 假如您所需耍的僅僅是一個(gè)編程if語句序列,帶有附加到分支的簡單代碼,那么最好便用 poli

13、cy活動(dòng)。policy活動(dòng)是一個(gè)規(guī)則集合。與各規(guī)則相關(guān)的代碼僅限于設(shè)置工作流屬性, 調(diào)用工作流方法或針對(duì)引用的程序集中的類型的靜態(tài)方法?;顒?dòng)與已排序的規(guī)則集合相關(guān)聯(lián),您可以通過編輯器定義規(guī)則。每條規(guī)則都有優(yōu)先級(jí)和 active屬性。這兩種屬性的組合確定了是否應(yīng)當(dāng)評(píng)估規(guī)則,以及采用哪種優(yōu)先級(jí)。另外, 規(guī)則還必須指定重估行為一"always (始終)”(默認(rèn)值)或“never (從不)”。假如設(shè)置為 “always”,規(guī)則將根據(jù)需要進(jìn)行重估,否則只進(jìn)行首次評(píng)估,以后無論工作流狀態(tài)如何變 化,也不再更改。然而,作為一個(gè)整體設(shè)置的規(guī)則要進(jìn)行正向推理。簡而言之,正向推理是指一個(gè)規(guī)則的 操作導(dǎo)致

14、具他相關(guān)規(guī)則被重估的能力。例如,對(duì)另一個(gè)規(guī)則測試的字段的值進(jìn)行更新操作需 要對(duì)所涉及的規(guī)則進(jìn)行重估(除非對(duì)該規(guī)則的重估被禁用)。正向推理有三種類型。隱式推 理表示運(yùn)行時(shí)引擎將判定哪些字段被一些操作修改了,然后自動(dòng)對(duì)它們進(jìn)行重佔(zhàn)。只要操作 顯式地作用于屬性,這種機(jī)制即可成功。假如有如下操作,情況又會(huì)怎樣:if this.minimumlength <= 8 then refreshinternalstate()有誰能夠知道refreshlntemalstate方法將要做什么?該方法可能會(huì)觸及涉及策略活動(dòng) 中其他規(guī)則的工作流屬性。通過使用方法聲明中的屬性,您可以顯式地表示該方法的行為:<

15、;rulewrite(npasswordlever')> _public sub refreshinternalstate()me. pass wordle vel = 1end subrulewrite丿成性表示方法將耍修改指定的屬性:同樣,ruleread屬性表示方法將姿從 指定的屬性中進(jìn)行讀収。這樣,就可以為運(yùn)行時(shí)引擎提供明確清處的信息以確保規(guī)則設(shè)置同 步。最后,您可以編寫顯式調(diào)用對(duì)涉及的屬性進(jìn)行更新的操作。例如:if this.minimumlength <= 8 thenrefreshinternalstate() update(,'passwordlev

16、er,)規(guī)則操作中的update方法會(huì)計(jì)劃對(duì)包含指定屬性的所冇規(guī)則進(jìn)行重佔(zhàn)。qqr推出數(shù)據(jù)恢復(fù)指南教程數(shù)據(jù)恢復(fù)指南教程數(shù)據(jù)恢復(fù)故障解析常用數(shù)據(jù)恢復(fù) 方案硬盤數(shù)據(jù)恢復(fù)教程數(shù)據(jù)保護(hù)方法數(shù)據(jù)恢復(fù)軟件專業(yè)數(shù)據(jù)恢復(fù)服務(wù)指南循環(huán)和重復(fù) 活動(dòng)這組活動(dòng)提供了典型的while活動(dòng)以及replicator活動(dòng),這些活動(dòng)與典型的for循環(huán) 有些共同點(diǎn)。while活動(dòng)接受條件并在每次迭代開始時(shí)對(duì)該條件進(jìn)行計(jì)算。假如條件為 “true”,該活動(dòng)將運(yùn)行指定的子活動(dòng)并重復(fù)直至條件為“false”。請(qǐng)注重在while主體內(nèi)答 應(yīng)進(jìn)行單一活動(dòng)。因此,您可能耍使用一個(gè)復(fù)合活動(dòng)(如sequence或parallel)在循壞中 執(zhí)行

17、多個(gè)活動(dòng)。(在此處,使用術(shù)語“交錯(cuò)”可能比“并行”更加準(zhǔn)確。因?yàn)闆]有涉及parallel 活動(dòng)的并發(fā),只冇同一線程內(nèi)的交錯(cuò)。)與forcach語句類似,replicator活動(dòng)創(chuàng)建并執(zhí)行 指定的子活動(dòng)的給定數(shù)雖的實(shí)例。您可以只指定一個(gè)子活動(dòng),但答應(yīng)使用復(fù)合或口定義活動(dòng)。 您不能通過聲明性屬性來控制迭代數(shù)。但是,您可以為初始化事件編寫一個(gè)處理程序,并針 對(duì)各個(gè)需要的實(shí)例,使用初始化數(shù)據(jù)填充currentchilddata集合:sub replicator l_initialized(by vai sender as object, by vai e as eventargs)console.wr

18、iteline("initializing .")replicator 1 .currentchilddata.add("you are #1")replicatorl.currentchilddata.add("you are#2") replicator 1.currentchilddata.add("you are #3") end sub前血所述的代碼段規(guī)定了 replicator的子活動(dòng)的三個(gè)實(shí)例的順序,每個(gè)實(shí)例均使用給 定的字符串進(jìn)行初始化。請(qǐng)注重,假如您將currentchilddata集合宣為空,r

19、eplicator將不 運(yùn)行任何了活動(dòng),并僅限于觸發(fā)頂級(jí)事件,女fl initialized事件和completed事件。您可以 使用對(duì)象(不一定是字符串)初始化了活動(dòng),包括自定義類的實(shí)例。replicator還包括標(biāo)示 各個(gè)子活動(dòng)初始化和完成的事件。默認(rèn)情況下,子實(shí)例按順序運(yùn)行,盡管通過設(shè)置 executiontype屬性,您町以選擇并行執(zhí)行。假如需要并行執(zhí)行,在復(fù)制器開始并執(zhí)行并行 線程前,可以創(chuàng)建所有子活動(dòng)實(shí)例。當(dāng)以順序模式執(zhí)行時(shí),只有當(dāng)前一個(gè)活動(dòng)結(jié)束時(shí)卜一個(gè) 活動(dòng)才能被實(shí)例化。假如沒有通過untilcondition屬性設(shè)置全局條件,replicator將在所 冇復(fù)制完成后才結(jié)束,否則

20、,將在untilconclition為“true”時(shí)終止活動(dòng)。值得注重的是, 盡管在所有子活動(dòng)已完成并且untilcondition屬性計(jì)算為“false”時(shí)活動(dòng)將被掛起, replicator也從不通過類似while循環(huán)中的子活動(dòng)進(jìn)行循環(huán)。在對(duì)活動(dòng)進(jìn)行全局實(shí)例化后, 在每個(gè)子活動(dòng)完成后以及所有包括的活動(dòng)都已完成后,將對(duì)untilcondition進(jìn)行計(jì)算。但 是有時(shí),假如條件計(jì)算為"true", replicator將立即退出。您可以將conditionedactivitygroup (cag)活動(dòng)中的條件執(zhí)行和循環(huán)混合在一起。cag 包含一些子活動(dòng)(可能是復(fù)合活動(dòng)),并

21、可運(yùn)行這些活動(dòng),直至滿足全局條件。基本上,cag 組合了 while和ifelse活動(dòng)的行為。通過以下偽代碼來表示內(nèi)部邏輯:while conditionif child 1.whcncondition then child 1 .executeif child2.whencondition then child2.executeif childn.whencondition then childn.executeend while毎個(gè)子活動(dòng)都有whencondition屬性。根據(jù)對(duì)指定條件的計(jì)算,可以在當(dāng)前的迭代屮 運(yùn)行或跳過活動(dòng)。請(qǐng)注重,假如子活動(dòng)沒有whencondition集合,子活動(dòng)

22、將只能在笫一次 被執(zhí)行,并在后續(xù)的迭代小被跳過。假如需要,可以根據(jù)狀態(tài)變化的依存關(guān)系對(duì)所有條件進(jìn) 行計(jì)算。在untilcondition返回“true”并立即取消所有當(dāng)前正在執(zhí)行的活動(dòng)后,cag活動(dòng)將 終止。假如沒有指定條件,當(dāng)因?yàn)闆]有設(shè)置條件或者條件計(jì)算為“false”而沒有子活動(dòng)運(yùn)行 時(shí),cag也將結(jié)束。同步塊涉及交錯(cuò)活動(dòng)的順序工作流都會(huì)對(duì)共享成員的訪問進(jìn)行系列化。然而,操作是不同的。 當(dāng)兩個(gè)或兩個(gè)以上以交錯(cuò)方式運(yùn)行的序列用到parallel活動(dòng)時(shí),操作是不同的。請(qǐng)看一下 圖5o while活動(dòng)包含兩個(gè)序列塊,然后,序列塊又將parallel活動(dòng)和代碼活動(dòng)聯(lián)系在一起。 在內(nèi)部,parall

23、el活動(dòng)有四個(gè)塊,每個(gè)塊都對(duì)定義為工作流類成員的數(shù)字執(zhí)行數(shù)學(xué)運(yùn)算。 parallel活動(dòng)的四個(gè)分支以交錯(cuò)方式執(zhí)行。(每一次在工作流實(shí)例中只有一個(gè)線程。該線程 在parallel活動(dòng)的分支間往返切換。)跨任務(wù)同步又如何呢?默認(rèn)情況下,子活動(dòng)內(nèi)部運(yùn)行 的每一段代碼都進(jìn)行對(duì)共享成員的直接訪問。圖 5 平行任務(wù)(click the image for a larger view)根據(jù)圖5所示的簡單架構(gòu),可能會(huì)出現(xiàn)每個(gè)分支都作為一個(gè)原了操作來運(yùn)行的情況。 這純加巧合,運(yùn)行嚴(yán)格依據(jù)各操作的復(fù)雜性和持續(xù)時(shí)間。假如每個(gè)分支由多個(gè)活動(dòng)組成,情 況會(huì)怎樣? synchronizationscope提供了聲明性和明

24、確的同步存取建模方法,它可以實(shí)現(xiàn)對(duì) 一組活動(dòng)中一個(gè)給定工作流實(shí)例內(nèi)的共亨狀態(tài)進(jìn)行同步存取。synchronizationscopc活動(dòng)內(nèi)運(yùn)行的工作流部分是一種不能中斷的原了操作。此處沒冇 事務(wù)語義,synchronizationscope活動(dòng)屮包含的操作不能i叫滾。在所冇基于活動(dòng)(這些活動(dòng) 具有并行執(zhí)行路徑,如parallel、replicator和cag)的解決方案中,synchronizationscope 活動(dòng)起著要害作用。圖6可以幫助您快速體驗(yàn)synchronizationscopc活動(dòng)的作用,該圖是圖5中工作流的 修改版本。blockmultiply活動(dòng)對(duì)延遲交錯(cuò)的兩個(gè)代碼塊進(jìn)行計(jì)數(shù)

25、。blockdivide活動(dòng)包含一 個(gè)未同步的代碼塊。假如您將blockmultiply的內(nèi)容放到同步范圍之外,blockdivide將可 能在blockmultiply的延遲階段執(zhí)行。根據(jù)耍進(jìn)行的更新的種類不同,這對(duì)能會(huì)成為一個(gè)嚴(yán) 重問題。synchronizationscope活動(dòng)可確保丁作流部分的連續(xù)性。圖 6 平行任務(wù)與同步范|節(jié)|(click the image for a smaller view) qqr推出數(shù)據(jù)恢復(fù)指南教程 數(shù)據(jù)恢復(fù)指南教程 數(shù)據(jù)恢復(fù)故障解析 常用數(shù)據(jù)恢復(fù) 方案碩盤數(shù)據(jù)恢復(fù)教程數(shù)據(jù)保護(hù)方法數(shù)據(jù)恢復(fù)軟件專業(yè)數(shù)據(jù)恢復(fù)服務(wù)指南界常處理正如其他基于.net的應(yīng)用程序一樣

26、,工作流能夠引發(fā)和捕捉異常。非凡是,您可以 使用throw活動(dòng)來引發(fā)一個(gè)特定的異throw活動(dòng)需要兒個(gè)設(shè)置一要引發(fā)的界常的類 型,存儲(chǔ)異常對(duì)象實(shí)例以進(jìn)行進(jìn)一步自定義的工作流類成員。只要在工作流項(xiàng)冃中引用了類 型,您就可以使用自定義的異常類型。耍捕捉丄作流活動(dòng)引發(fā)的界常,您要添加faulthandler活動(dòng)。工作流設(shè)計(jì)器提供了一 個(gè)用于您添加的錯(cuò)課處理程序的容器。每個(gè)處理程序一定是某個(gè)工作流的一部分,一旦捕捉 異常,該程序即執(zhí)行。添加faulthandler活動(dòng)后,您可以定義要捕捉的異常的類型。您可 以通過fault加性訪問顯常對(duì)彖。值得注重的是,要可視化錯(cuò)誤處理程序,您必須在visual st

27、udio 2005設(shè)計(jì)器中切換視圖并通過單擊設(shè)計(jì)器視圖底部的選項(xiàng)卡列表來選擇“view faults (查看錯(cuò)謀)”選項(xiàng)卡。事務(wù).net framework 2.0包括一個(gè)輕松而有效處理事務(wù)的對(duì)彖一無論參與對(duì)彖的數(shù)冃和 類型以及范i韋i如何,也無論事務(wù)是木地的還是分布式的。該對(duì)象被命名為transactionscope, -般情況下,您可以根據(jù)如下模式進(jìn)行使用:using ts as new transactionscope ts.completeend usingtransactionscope對(duì)象保證在出現(xiàn)故障的惜況下,事務(wù)既可以被提交也可以被回滾,更 為重要的是,它可以確定您需要一個(gè)木地

28、事務(wù)還是一個(gè)分布式事務(wù),并登記所冇必要的資源。 當(dāng)代碼到達(dá)一個(gè)無法本地運(yùn)行的點(diǎn)時(shí),相應(yīng)地,transactionscope提升至分布式事務(wù)處理協(xié) 調(diào)器(dtc)。實(shí)施itnmsaction接口的所有對(duì)象可以隨-個(gè)事務(wù)一起登記。該列表包括所 冇標(biāo)準(zhǔn)ado.net 2.0數(shù)據(jù)提供程序,并fl microsoft消息隊(duì)列以兼容模式工作。值得注重的是對(duì)于分布式事務(wù),transactionscope和企業(yè)服務(wù)之間存在一些差別。 transactionscope屬于專門針對(duì)基于.net的應(yīng)用程序而設(shè)計(jì)的事務(wù)框架 一 system.transactions«在內(nèi) n|j, system.trans

29、actions 命名空間的類有時(shí)會(huì)以為 dtc 和 com+ 委派一些工作作為結(jié)束。為什么在這一點(diǎn)上transactionscope至關(guān)重要? transactionscope windows workflow foundation 活動(dòng)僅僅是 transactionscope .net 類實(shí)例的一個(gè)工作流包 裝程序。當(dāng)您為工作流添加transactionscope活動(dòng)時(shí),您可以設(shè)置要完成的事務(wù)的超時(shí)時(shí)間, 并設(shè)置所需的隔離級(jí)別。事務(wù)范圍內(nèi)組合的所有活動(dòng)形成了能夠?qū)崿F(xiàn)典型acid架構(gòu)的工 作單位。在所有子活動(dòng)都成功完成后將提交事務(wù),工作流繼續(xù)進(jìn)行到下一步。假如在范圍內(nèi) 引發(fā)異常,transac

30、tionscope活動(dòng)自動(dòng)回滾。編寫事務(wù)性工作流并不要求您顯式地處理提交 和回滾語義一假如您要提交事務(wù)和引發(fā)異常'來屮止事務(wù),您只需順具白然。該活動(dòng)將可以 輕松治理其他任何事情。請(qǐng)注重,您不能嵌套兩個(gè)或兩個(gè)以上的transactionscope活動(dòng)。同樣地,您不能使用 suspend活動(dòng)掛起事務(wù)內(nèi)的工作流。然而,您可以通過listen或eventhandlingscope活動(dòng), 將事件處理程序整合到事務(wù)屮。在這種情況卜工作流主機(jī)應(yīng)當(dāng)包js持久性服務(wù),否則,假 如工作流試圖將它的狀態(tài)保存為空閑狀態(tài),會(huì)引發(fā)異常。此外,相關(guān)的活動(dòng),如 compcnsatablctransactionscop

31、c還支持補(bǔ)償。補(bǔ)償是在冇后續(xù)業(yè)務(wù)預(yù)期的情況下,從邏輯上 撤消已完成的事務(wù)的過程。補(bǔ)償與回滾不同,因?yàn)樗且环N當(dāng)工作流屮發(fā)生違反規(guī)則的情況 時(shí),収消已成功完成和提交的事務(wù)所產(chǎn)牛的影響的有效方法。在兩個(gè)帳戶間進(jìn)行資金劃轉(zhuǎn)的 事務(wù)是一個(gè)典型的回滾示例。第一個(gè)調(diào)用將資金從一個(gè)帳戶中取出,第二個(gè)調(diào)用將相同數(shù)額 的資金劃轉(zhuǎn)至另一個(gè)帳戶。只要數(shù)據(jù)庫支持兩階段提交模型,假如在事務(wù)屮引發(fā)異常,i叫滾 可恢復(fù)一致的狀態(tài)。設(shè)想一下一個(gè)訂單處理工作流,其中一個(gè)事務(wù)被用于通過信用卡進(jìn)行支付。第一步,首 先從信川卡中捉取資金來支付貨款。然后,在交易成功完成后,該貨物不能再被銷售。假如違反了業(yè)務(wù)規(guī)則,需要按照合適的規(guī)定對(duì)交

32、易結(jié)果進(jìn)行補(bǔ)償一一般是將資金劃入簽帳卡。通過右鍵單擊compensatabletransactionscope活動(dòng),您可以切換到事務(wù)的“補(bǔ)償”視 圖并添加所有補(bǔ)償事務(wù)影響所需的活動(dòng)。在圖7中,orderscope事務(wù)與補(bǔ)償活動(dòng)規(guī)定相關(guān) 聯(lián),該規(guī)定要求在出現(xiàn)業(yè)務(wù)異常的情況下,應(yīng)將已提取的資金退冋。正如我前而談到的,工 作流屮的異常是通過異常處理程序捕捉的。對(duì)于某一特定異常(如productdiscontinued), 您可以調(diào)用一個(gè)compensate活動(dòng),該活動(dòng)已綁定到其影響作用已被取消的事務(wù)活動(dòng)。一般 情況下,compensate活動(dòng)會(huì)觸發(fā)適用于任何可被補(bǔ)償?shù)幕顒?dòng)(即,適用于實(shí)施 icompensatableactivity 接口 的活動(dòng))的補(bǔ)償機(jī)制。與 compensatabletransactionscope 一起, compensatablesequence也實(shí)施了木接口并能夠用于非事務(wù)性的補(bǔ)償怙:況。不過,您也可以 編寫支持補(bǔ)償?shù)淖远x活動(dòng)。圖 7 事務(wù)與補(bǔ)償活動(dòng)(click the image for a larger view)調(diào)用其他代碼此外,還有一些活動(dòng)可調(diào)用和執(zhí)行代碼。這些活動(dòng)包扌舌:code、invoke workflow >

溫馨提示

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

評(píng)論

0/150

提交評(píng)論