WF學(xué)習(xí)系列之一:WF基本知識(shí)點(diǎn)概述此文是從msdn中摘錄而來,并經(jīng)過相關(guān)的提煉,主要介紹了WF的基礎(chǔ)知識(shí)點(diǎn),希望對(duì)大家有所幫助。本文主要包括以下11個(gè)方面:
1 工作流概述 :工作流是一組存儲(chǔ)為模型的名為活動(dòng)的基本單元,活動(dòng)用于描述實(shí)際進(jìn)程。工作流運(yùn)行時(shí)引擎用來創(chuàng)建和維護(hù)工作流實(shí)例的。 2 活動(dòng)概述:活動(dòng)是工作流的基本單元,可以執(zhí)行單個(gè)操作,也可以是一組復(fù)合的活動(dòng)。活動(dòng)在其生存期內(nèi)有六種狀態(tài):Initialized, Executing, Canceling, Closed, Compensating, Faulting。 3 服務(wù)概述 :工作流運(yùn)行的時(shí)候,需要各種服務(wù),主要包括:計(jì)劃服務(wù)(創(chuàng)建和管理在工作流運(yùn)行時(shí)引擎以異步/同步的方式運(yùn)行工作流實(shí)例的線程);CommitWorkBatch服務(wù)(啟用與提交工作批次相關(guān)的自定義邏輯) 持久性服務(wù)(滿足長時(shí)間才能完成的工作流,將工作流暫時(shí)從內(nèi)存轉(zhuǎn)移到硬盤);跟蹤服務(wù)(宿主通過捕獲工作流執(zhí)行期間引發(fā)的事情,以觀察到工作流實(shí)例,可以采用將信息入庫、輸出到控制臺(tái)等多種方式)。 4 補(bǔ)償概述 :主要用于發(fā)生異常時(shí)的撤銷。 5 本地通信和關(guān)聯(lián)概述 :解決宿主進(jìn)程同工作流或工作流中特定活動(dòng)通信的問題而提出的兩個(gè)概念。 6 持久性概述 :從內(nèi)存中卸載工作流,而且工作流可以序列化為持久性存儲(chǔ)。 7 跟蹤概述 :捕獲有關(guān)工作流實(shí)例的信息,并在這些實(shí)例執(zhí)行時(shí)存儲(chǔ)該信息。 8 序列化概述 :對(duì)工作流、活動(dòng)和規(guī)則可以進(jìn)行序列化和反序列化。 9 工作流更改概述: 可以在運(yùn)行時(shí)動(dòng)態(tài)更新工作流實(shí)例和聲明性規(guī)則,不必重新編譯和重新啟動(dòng)工作流。 10 “規(guī)則和條件”概述: Windows Workflow Foundation 可將業(yè)務(wù)邏輯作為規(guī)則或條件來實(shí)現(xiàn),使用工作流更改來執(zhí)行動(dòng)態(tài)更新,可在運(yùn)行時(shí)修改這些規(guī)則和聲明性條件。 11 錯(cuò)誤處理概述 :Windows Workflow Foundation 中的錯(cuò)誤處理指的是以異步方式處理異常。 12 工作流標(biāo)記概述 :采用XAML,使開發(fā)人員和設(shè)計(jì)人員以聲明的方式為業(yè)務(wù)邏輯建模。
Windows Workflow Foundation 是編程模型、引擎和工具,用于在windows上快速生成啟用工作流的應(yīng)用程序。它包括一個(gè)命名空間、一個(gè)進(jìn)程內(nèi)工作流和多個(gè)VS2005設(shè)計(jì)器。 Windows Workflow Foundation 是一個(gè)框架,讓用戶可以在其為Windows Vista、Windows XP和Windows Server 2003 系列編寫的應(yīng)用程序中創(chuàng)建系統(tǒng)或人工工作流。 Windows Workflow Foundation 可用于解決簡單方案,如根據(jù)用戶輸入顯示UI控件,或用于解決大型企業(yè)遇到的復(fù)雜方案,如訂單處理和庫存控制。
Windows Workflow Foundation 可以處理的方案包括: 在業(yè)務(wù)線應(yīng)用程序中啟用工作流 用戶界面頁流 以文檔為中心的工作流 人工工作流 面向服務(wù)應(yīng)用程序的復(fù)合工作流 業(yè)務(wù)規(guī)則驅(qū)動(dòng)的工作流 系統(tǒng)管理的工作流 Windows Workflow Foundation 提供了與其他 .NET Framework 3.0 技術(shù)(如 Windows Communication Foundation 和 Windows Presentation Foundation)一致和熟悉的開發(fā)體驗(yàn)。 Windows Workflow Foundation API 完全支持 Visual Basic .NET 和 C#、專用工作流編譯器、在工作流中調(diào)試、圖形工作流設(shè)計(jì)器,并支持完全用代碼或標(biāo)記開發(fā)工作流。 Windows Workflow Foundation 還提供了可擴(kuò)展模型和設(shè)計(jì)器,用于生成為最終用戶或跨多個(gè)項(xiàng)目重用封裝工作流功能的自定義活動(dòng)。
1 工作流概述 工作流是一組存儲(chǔ)為模型的名為活動(dòng)的基本單元,活動(dòng)用于描述實(shí)際進(jìn)程。 工作流提供了一種方法,用于描述多項(xiàng)短期運(yùn)行或長期運(yùn)行的工作之間的執(zhí)行順序和依賴關(guān)系。 此工作從頭到尾地貫穿模型,并且活動(dòng)可以人工執(zhí)行或由系統(tǒng)功能執(zhí)行。
工作流運(yùn)行時(shí)引擎 每個(gè)正在運(yùn)行的工作流實(shí)例都是由進(jìn)程中運(yùn)行時(shí)引擎創(chuàng)建和維護(hù)的,該引擎通常稱為“工作流運(yùn)行時(shí)引擎”。 在一個(gè)應(yīng)用程序域中可以有多個(gè)工作流運(yùn)行時(shí)引擎,并且運(yùn)行時(shí)引擎的每個(gè)實(shí)例均可支持多個(gè)并發(fā)運(yùn)行的工作流實(shí)例。
工作流模型經(jīng)過編譯后,可以在包括控制臺(tái)應(yīng)用程序、基于窗體的應(yīng)用程序、Windows 服務(wù)、ASP.NET 網(wǎng)站和 Web 服務(wù)在內(nèi)的任意 Windows 進(jìn)程中執(zhí)行。 由于工作流是在進(jìn)程中承載,因此工作流可以輕松地與其宿主應(yīng)用程序通信。
下面的插圖顯示了如何在一個(gè)宿主應(yīng)用程序的進(jìn)程中同時(shí)承載工作流、活動(dòng)和工作流運(yùn)行時(shí)引擎。
2 活動(dòng)概述 活動(dòng)是工作流的基本單元。 以編程方式將活動(dòng)添加到工作流中,與向根節(jié)點(diǎn)添加 XML DOM 子節(jié)點(diǎn)的方式類似。 當(dāng)給定流路徑中的所有活動(dòng)都完成運(yùn)行時(shí),工作流實(shí)例即完成。 活動(dòng)可以執(zhí)行單個(gè)操作,如向數(shù)據(jù)庫寫入值,也可以執(zhí)行復(fù)合活動(dòng)并包含一組活動(dòng)。 活動(dòng)有兩種行為類型:運(yùn)行時(shí)和設(shè)計(jì)時(shí)。 運(yùn)行時(shí)行為在執(zhí)行時(shí)指定操作。 設(shè)計(jì)時(shí)行為在設(shè)計(jì)器中顯示時(shí)可以控制活動(dòng)的外觀及其交互。 Windows Workflow Foundation 包括一個(gè)標(biāo)準(zhǔn)活動(dòng)庫,并為您提供創(chuàng)建自己的活動(dòng)的機(jī)制。 這支持工作流之間的擴(kuò)展性和可重用性。 Windows Workflow Foundation 包含一組默認(rèn)活動(dòng),這些活動(dòng)提供了有關(guān)控制流、條件、事件處理、狀態(tài)管理以及與應(yīng)用程序和服務(wù)通信的功能。 在設(shè)計(jì)工作流時(shí),可以使用 Windows Workflow Foundation 提供的活動(dòng),并且可以創(chuàng)建自己的自定義活動(dòng)。
活動(dòng)是工作流的基本構(gòu)造塊。 工作流是一組以樹狀結(jié)構(gòu)分層組織的活動(dòng)。 活動(dòng)表示工作流中的操作。 它可以是延遲之類的簡單操作,也可以是由多個(gè)子活動(dòng)組成的復(fù)合活動(dòng)。
與工作流一樣,活動(dòng)可以是順序的,這意味著其操作順序在設(shè)計(jì)時(shí)指定。 活動(dòng)也可以是事件驅(qū)動(dòng)的,這意味著其操作順序是在運(yùn)行時(shí)為響應(yīng)外部事件而確定的。
每個(gè)活動(dòng)都有一個(gè)活動(dòng)執(zhí)行上下文,它表示活動(dòng)的執(zhí)行環(huán)境。 活動(dòng)執(zhí)行上下文類似于 HTTP 上下文:對(duì)象具有狀態(tài)、一組參數(shù)以及它在給定時(shí)間點(diǎn)所獨(dú)有的構(gòu)造。 某些復(fù)合活動(dòng)(如 ReplicatorActivity 活動(dòng)和 WhileActivity 活動(dòng))會(huì)在執(zhí)行期間創(chuàng)建其子活動(dòng)的多個(gè)實(shí)例,每個(gè)子活動(dòng)都有其自己的活動(dòng)執(zhí)行上下文作為其運(yùn)行環(huán)境。有關(guān)活動(dòng)執(zhí)行上下文的更多信息,請(qǐng)參見了解活動(dòng)執(zhí)行上下文。
ActivityExecutionContext (AEC) 是在宿主應(yīng)用程序調(diào)用 Start 方法時(shí)為活動(dòng)創(chuàng)建的執(zhí)行環(huán)境。
AEC 提供了一種復(fù)合活動(dòng),該復(fù)合活動(dòng)具有執(zhí)行 (ExecuteActivity) 或取消 (CancelActivity) 子活動(dòng)的能力。 它也可以通過 CloseActivity 方法來關(guān)閉自己。 這些是僅有的父活動(dòng)可以通過 AEC 控制的執(zhí)行狀態(tài)更改。 所有其他活動(dòng)狀態(tài)都是由工作流運(yùn)行時(shí)引擎控制的。
AEC 具有名為 ExecutionContextManager 的屬性,使其可以生成新 AEC。 這些 AEC 是父活動(dòng)(如 WhileActivity 活動(dòng)、ReplicatorActivity 活動(dòng)或 ConditionedActivityGroup 活動(dòng))每次運(yùn)行其子活動(dòng)超過一次時(shí)生成的。 每次迭代都使用其自己的 AEC 創(chuàng)建一個(gè)克隆的活動(dòng),因此子活動(dòng)的這些不同實(shí)例可以獨(dú)立運(yùn)行(而對(duì)于 ReplicatorActivity 活動(dòng)則可能并行運(yùn)行)。
此外,ActivityExecutionContextManager 恢復(fù)保持的上下文和完成的上下文,其中所有活動(dòng)處于 Closed 或 Initialized 狀態(tài),并具有可選的持久性。AEC 只有在其相關(guān)活動(dòng)處于 Closed 或 Initialized 狀態(tài)時(shí)才能完成。 活動(dòng)只有在生成的所有執(zhí)行上下文 (CreateExecutionContext) 都已完成 (CompleteExecutionContext) 時(shí)才能關(guān)閉。 違反此行為將導(dǎo)致工作流運(yùn)行時(shí)引擎引發(fā)異常。
了解活動(dòng)狀態(tài)模型 活動(dòng)在其生存期內(nèi)可以有六種狀態(tài)。 這些狀態(tài)分別為 Initialized、Executing、Canceling、Closed、Compensating 和 Faulting。
在 Initialized 狀態(tài)期間,將為活動(dòng)創(chuàng)建 ActivityExecutionContext,并將執(zhí)行特定于該活動(dòng)的其他初始化詳細(xì)信息。 例如,某些 Windows Workflow Foundation 活動(dòng)(如 SuspendActivity)會(huì)在初始化期間檢查其是否具有父級(jí)復(fù)合活動(dòng)。當(dāng)某個(gè)活動(dòng)進(jìn)入 Executing 狀態(tài)時(shí),將會(huì)執(zhí)行該活動(dòng)的主要功能。 活動(dòng)的 Canceling 狀態(tài)可以由父活動(dòng)顯式置入,也可以因?yàn)樵趫?zhí)行該活動(dòng)期間引發(fā)異常而置入。 Closed 狀態(tài)是活動(dòng)的最后和最終狀態(tài)。 需要注意的一個(gè)問題是,如果某活動(dòng)成功完成,但根據(jù)業(yè)務(wù)邏輯隨后必須經(jīng)過 Compensating 活動(dòng)。 因此,該活動(dòng)將會(huì)從 Closed 轉(zhuǎn)換到 Compensating,然后在完成補(bǔ)償邏輯后轉(zhuǎn)換回 Closed。 有關(guān)補(bǔ)償?shù)母嘈畔?,?qǐng)參見在工作流中使用補(bǔ)償和使用 CompensateActivity 活動(dòng)。如果在活動(dòng)的 Executing 狀態(tài)、Canceling 狀態(tài)或 Compensating 狀態(tài)期間引發(fā)異常,活動(dòng)將轉(zhuǎn)換到 Faulting 狀態(tài)。
下面的流程圖演示了活動(dòng)如何在各種活動(dòng)狀態(tài)之間轉(zhuǎn)換。
紅色實(shí)線表示工作流運(yùn)行時(shí)引擎負(fù)責(zé)將活動(dòng)從 Initialized 狀態(tài)轉(zhuǎn)換到 Executing 狀態(tài),或從 Closed 狀態(tài)轉(zhuǎn)換到 Compensating 狀態(tài)。 黃色實(shí)線表示父活動(dòng)負(fù)責(zé)將子活動(dòng)從 Executing 狀態(tài)轉(zhuǎn)換到 Closed 狀態(tài)。 如果您創(chuàng)建自定義復(fù)合活動(dòng),則必須親自進(jìn)行處理。 藍(lán)色實(shí)線表示工作流運(yùn)行時(shí)引擎負(fù)責(zé)將活動(dòng)從 Executing、Canceling 或 Compensating 狀態(tài)轉(zhuǎn)換到 Faulting 狀態(tài)。 黃色虛線表示工作流運(yùn)行時(shí)引擎負(fù)責(zé)將活動(dòng)從 Canceling 狀態(tài)、Compensating 狀態(tài)或 Faulting 狀態(tài)轉(zhuǎn)換到 Closed 狀態(tài)。
注意: 活動(dòng)不能從 Closed 狀態(tài)轉(zhuǎn)換到 Executing 狀態(tài)。 如果試圖進(jìn)行轉(zhuǎn)換,將會(huì)在調(diào)用 Execute 時(shí)引發(fā)異常。 僅當(dāng)所有子活動(dòng)都處于 Closed 或 Initialized 狀態(tài)時(shí),才能關(guān)閉活動(dòng)。 由于這是一條遞歸規(guī)則,因此意味著試圖關(guān)閉的活動(dòng)下面的整個(gè)樹必須為 Closed 或 Initialized 狀態(tài),調(diào)用才會(huì)成功。
3 服務(wù)概述 當(dāng)工作流實(shí)例運(yùn)行時(shí),工作流運(yùn)行時(shí)引擎使用多種服務(wù)。 Windows Workflow Foundation 提供可滿足多種應(yīng)用程序需要的運(yùn)行時(shí)服務(wù)的默認(rèn)實(shí)現(xiàn),例如在 SQL 數(shù)據(jù)庫中存儲(chǔ)工作流實(shí)例的執(zhí)行詳細(xì)信息的持久性服務(wù)。 這些服務(wù)組件是可插入的,這樣,應(yīng)用程序就可以以特定于執(zhí)行環(huán)境的方式提供這些服務(wù)。運(yùn)行時(shí)引擎使用的其他類型服務(wù)包括計(jì)劃服務(wù)、事務(wù)服務(wù)和跟蹤服務(wù)。 通過從基服務(wù)類派生可以創(chuàng)建自定義服務(wù)以擴(kuò)展 Windows Workflow Foundation 平臺(tái)。使用 XML 文件而不使用數(shù)據(jù)庫進(jìn)行存儲(chǔ)的持久性服務(wù)就屬于這種情況。 Windows Workflow Foundation 提供了多項(xiàng)服務(wù),您的應(yīng)用程序可以使用這些服務(wù)來執(zhí)行以下操作:通過事務(wù)執(zhí)行批處理工作、管理工作流實(shí)例的線程、將工作流實(shí)例保留到存儲(chǔ)介質(zhì)中以在日后進(jìn)行檢索,以及跟蹤工作流實(shí)例的執(zhí)行情況。 Windows 工作流計(jì)劃服務(wù) Windows 工作流計(jì)劃服務(wù)管理工作流運(yùn)行時(shí)引擎計(jì)劃工作流實(shí)例的方式。 無論這些服務(wù)是通過 DefaultWorkflowSchedulerService 以異步方式處理的,還是通過 ManualWorkflowSchedulerService 以手動(dòng)、同步的方式處理的,它們都是工作流解決方案的重要部分。 默認(rèn)情況下,DefaultWorkflowSchedulerService 由工作流運(yùn)行時(shí)引擎使用。它創(chuàng)建和管理在工作流運(yùn)行時(shí)引擎上以異步方式運(yùn)行工作流實(shí)例的線程。 等待運(yùn)行的工作流存儲(chǔ)在 DefaultWorkflowSchedulerService 的內(nèi)部隊(duì)列中。 當(dāng) DefaultWorkflowSchedulerService 要啟動(dòng)工作流時(shí),從 .NET Framework 線程池中獲取一個(gè)線程并使用此線程運(yùn)行工作流。 MaxSimultaneousWorkflows 屬性確定調(diào)度程序服務(wù)同一時(shí)間允許的并發(fā)線程數(shù)。例如,如果限值為 4,則 DefaultWorkflowSchedulerService 將從 .NET Framework 線程池中最多獲取 4 個(gè)線程來執(zhí)行工作流。如果已經(jīng)運(yùn)行 4 個(gè)工作流,則其他工作項(xiàng)(工作流)將放入隊(duì)列中,最終在線程可用時(shí)執(zhí)行。 下圖演示 DefaultWorkflowSchedulerService 如何以異步方式執(zhí)行工作流。
ManualWorkflowSchedulerService 提供了一個(gè)線程服務(wù),該服務(wù)允許創(chuàng)建工作流實(shí)例的宿主應(yīng)用程序指定用于運(yùn)行工作流實(shí)例的 Thread。 使用此線程服務(wù),宿主應(yīng)用程序可在單個(gè) Thread 上運(yùn)行一個(gè)工作流實(shí)例(即處于同步模式)。 此模式將阻止宿主應(yīng)用程序的執(zhí)行,直到工作流實(shí)例進(jìn)入空閑狀態(tài)。 隨后,只能通過使用此服務(wù)的 RunWorkflow 方法執(zhí)行工作流實(shí)例?;蛘?,可以通過將 useActiveTimers 構(gòu)造函數(shù)參數(shù)設(shè)置為 true,在 .Net 計(jì)時(shí)器創(chuàng)建的線程上運(yùn)行該工作流。如果此計(jì)時(shí)器過期,將在該計(jì)時(shí)器的線程(而不是宿主應(yīng)用程序的線程)上執(zhí)行該工作流。 此計(jì)時(shí)器作為 DelayActivity 活動(dòng)來實(shí)現(xiàn)。 ManualWorkflowSchedulerService 通過重用一個(gè)線程(該線程發(fā)出 ASP.NET Web 請(qǐng)求以運(yùn)行該工作流實(shí)例),對(duì) ASP.NET 進(jìn)程中生成的線程數(shù)進(jìn)行控制。 這確保了工作流運(yùn)行時(shí)中的活動(dòng)線程數(shù)在任意時(shí)候都等于 ASP.NET 進(jìn)程中的 Web 活動(dòng)請(qǐng)求數(shù)。 ManualWorkflowSchedulerService 不會(huì)自動(dòng)運(yùn)行隊(duì)列中的工作流實(shí)例。宿主必須調(diào)用 RunWorkflow 來運(yùn)行指定的工作流。
Windows 工作流 CommitWorkBatch 服務(wù) Windows 工作流 CommitWorkBatch 服務(wù)的用途是啟用與提交工作批次相關(guān)的自定義邏輯(又稱作持久性點(diǎn))。 當(dāng)提交工作批次時(shí),運(yùn)行時(shí)將對(duì)當(dāng)前 CommitWorkBatch 服務(wù)進(jìn)行調(diào)用并傳遞委托,該委托可以對(duì)工作批次執(zhí)行實(shí)際提交。運(yùn)行時(shí)仍必須執(zhí)行提交,但是它允許服務(wù)將自身插入到進(jìn)程中,從而支持針對(duì)提交進(jìn)程進(jìn)行一些自定義。 DefaultWorkflowCommitWorkBatchService 服務(wù)的目的在于允許自定義邏輯提交工作批次(又稱作持久點(diǎn))。當(dāng)提交工作批次時(shí),工作流運(yùn)行時(shí)將對(duì) DefaultWorkflowCommitWorkBatchService 服務(wù)進(jìn)行調(diào)用并為其提供委托,調(diào)用該委托可以對(duì)工作批次執(zhí)行實(shí)際提交。運(yùn)行時(shí)仍必須執(zhí)行提交;但是它允許該服務(wù)將自身插入到進(jìn)程中,以便根據(jù)提交進(jìn)程進(jìn)行自定義。
DefaultWorkflowCommitWorkBatchService 服務(wù)唯一的真正要求是:在調(diào)用它的 CommitWorkBatch 方法時(shí),如果不存在事務(wù),則將創(chuàng)建一個(gè)事務(wù)。 如果事務(wù)不存在(當(dāng) Current 屬性返回 null 時(shí)會(huì)發(fā)生這種情況),DefaultWorkflowCommitWorkBatchService 必須在調(diào)用 CommitWorkBatchCallback 委托之前創(chuàng)建一個(gè)事務(wù)并設(shè)置環(huán)境事務(wù)。 這是通過用 TransactionScope 包裝委托調(diào)用來完成的。 使用此服務(wù)類型的主要目的在于啟用自定義的錯(cuò)誤處理邏輯。 如果該事務(wù)由 DefaultWorkflowCommitWorkBatchService 服務(wù)擁有,那么,由于它會(huì)在 Current 返回 null(在 Visual Basic 中為 Nothing)時(shí)創(chuàng)建一個(gè)事務(wù),因此它可以多次調(diào)用委托,并為每個(gè)調(diào)用創(chuàng)建一個(gè)新事務(wù)。 一個(gè)最常見的示例就是處理間歇性網(wǎng)絡(luò)問題或 SQL 群集故障轉(zhuǎn)移。 如果在調(diào)用 CommitWorkBatchCallback 時(shí)引發(fā)異常,則 WorkflowCommitWorkBatchService 可以捕獲此異常、啟動(dòng)新事務(wù)并再次調(diào)用委托。 這為工作流實(shí)例執(zhí)行提供了一定的彈性,否則將導(dǎo)致工作流終止。 注意: 如果當(dāng)前的環(huán)境事務(wù)是由 WorkflowCommitWorkBatchService 服務(wù)創(chuàng)建的,則該服務(wù)只能重試提交。 如果在運(yùn)行時(shí)調(diào)用 CommitWorkBatch 方法時(shí)已經(jīng)存在環(huán)境事務(wù),則意味著某個(gè)其他對(duì)象擁有該事務(wù),并且可能已對(duì)它執(zhí)行了某些工作。由于 DefaultWorkflowCommitWorkBatchService 服務(wù)不能重新生成外部工作,因此它重試提交無效。 TransactionScopeActivity 事務(wù)或者在調(diào)用 Unload 方法之前由宿主代碼創(chuàng)建的事務(wù)就是這樣的示例。
也可以選擇使用 SharedConnectionWorkflowCommitWorkBatchService 服務(wù)。 此服務(wù)用于在不同對(duì)象之間使用共享連接的數(shù)據(jù)庫事務(wù)。 若要在 WorkflowRuntime 實(shí)例中使用 SharedConnectionWorkflowCommitWorkBatchService 服務(wù)而不是 DefaultWorkflowCommitWorkBatchService 服務(wù),請(qǐng)使用 AddService 方法,如下例所示。 SharedConnectionWorkflowCommitWorkBatchService 構(gòu)造函數(shù)的參數(shù)是數(shù)據(jù)庫連接字符串。 注意: 如果 SharedConnectionWorkflowCommitWorkBatchService 服務(wù)所用的 SQL Server 已關(guān)閉(例如由于 SQL 群集故障轉(zhuǎn)移或間歇性網(wǎng)絡(luò)問題所致),則 SharedConnectionWorkflowCommitWorkBatchService 服務(wù)將重試提交過程至少 15 至 20 次,然后引發(fā) ServicesExceptionNotHandled 事件。 但是,僅當(dāng) SharedConnectionWorkflowCommitWorkBatchService 服務(wù)的 EnableRetries 屬性設(shè)置為 true 時(shí),才會(huì)發(fā)生此行為。
Windows 工作流持久性服務(wù) 許多業(yè)務(wù)流程都需要花很長時(shí)間才能完成(長達(dá)數(shù)月或甚至數(shù)年)。 將工作流保存在內(nèi)存中不僅不切實(shí)際(由于內(nèi)存限制的原因),而且,因?yàn)楸仨氃趩我环?wù)器上處理實(shí)例,所以還會(huì)妨礙縮放。 許多這些長期運(yùn)行的工作流都是執(zhí)行不活躍的流程或過程邏輯,并且實(shí)際上處于空閑狀態(tài),等待來自用戶或其他系統(tǒng)的輸入。通過卸載空閑的實(shí)例,主機(jī)應(yīng)用程序?qū)⒛軌蚬?jié)省內(nèi)存,并且能夠跨處理服務(wù)器進(jìn)行縮放。
當(dāng)工作流運(yùn)行的時(shí)候發(fā)生特定情況時(shí),工作流運(yùn)行時(shí)引擎就會(huì)使用持久性服務(wù)(如果在運(yùn)行時(shí)加載了持久性服務(wù))保留有關(guān)工作流實(shí)例的狀態(tài)信息。這些情況包括: 當(dāng)完成 TransactionScopeActivity 活動(dòng)和 CompensatableTransactionScopeActivity 活動(dòng)中的原子事務(wù)時(shí)。 當(dāng)工作流實(shí)例空閑,且對(duì) WorkflowPersistenceService 將 UnloadOnIdle 標(biāo)志設(shè)置為 true 時(shí)。 例如,在使用 DelayActivity 活動(dòng)時(shí)會(huì)發(fā)生此情況。 當(dāng)運(yùn)行時(shí)主機(jī)應(yīng)用程序?qū)ぷ髁鲗?shí)例調(diào)用 System.Workflow.Runtime.WorkflowInstance.Unload 或 System.Workflow.Runtime.WorkflowInstance.TryUnload 時(shí)。 當(dāng)中止工作流實(shí)例或工作流實(shí)例結(jié)束時(shí)。 當(dāng)使用 PersistOnCloseAttribute 屬性的自定義活動(dòng)完成時(shí)。
如果滿足這些條件之一且將持久性服務(wù)添加到運(yùn)行時(shí)引擎,則運(yùn)行時(shí)引擎會(huì)調(diào)用由持久性服務(wù)提供的方法,以保存關(guān)于工作流實(shí)例的狀態(tài)信息。同樣,當(dāng)工作流運(yùn)行時(shí)引擎必須還原以前保留的工作流實(shí)例時(shí),它調(diào)用由持久性服務(wù)提供的方法,以加載此狀態(tài)信息。 換句話說,工作流實(shí)例決定持久性發(fā)生的時(shí)間,但持久性服務(wù)決定是否執(zhí)行必要的持久性操作。
由 SqlWorkflowPersistenceService 管理的工作流狀態(tài)的另一部分是計(jì)時(shí)器信息。 每當(dāng)在您的工作流定義內(nèi)配置 DelayActivity 活動(dòng),且使用類似 SqlWorkflowPersistenceService 的持久性服務(wù)時(shí),與該活動(dòng)相關(guān)的時(shí)間跨度信息會(huì)作為工作流狀態(tài)的一部分被保留下來。 每當(dāng)由工作流運(yùn)行時(shí)計(jì)算工作流實(shí)例時(shí),都會(huì)處理掛起計(jì)時(shí)器事件。
創(chuàng)建持久性服務(wù) 可以通過從 WorkflowPersistenceService 類派生一個(gè)類來創(chuàng)建持久性服務(wù)。通過調(diào)用 AddService 或在應(yīng)用程序配置文件中添加合適的項(xiàng),可以將持久性服務(wù)添加到工作流運(yùn)行時(shí)引擎。 Windows Workflow Foundation 提供了 SqlWorkflowPersistenceService 類,這是一種全新的持久性服務(wù),可以按原樣使用或?qū)ζ溥M(jìn)行擴(kuò)展。 有關(guān)創(chuàng)建自定義持久性服務(wù)的更多信息,請(qǐng)參見創(chuàng)建自定義持久性服務(wù)。有關(guān)使用 SqlWorkflowPersistenceService 類的更多信息,請(qǐng)參見使用 SqlWorkflowPersistenceService。 注意: WorkflowRuntime 必須僅包含一個(gè)持久性服務(wù)。
鎖定工作流狀態(tài)信息 工作流運(yùn)行時(shí)引擎具有鎖定工作流狀態(tài)信息的語義,當(dāng)在其他進(jìn)程中運(yùn)行的持久性服務(wù)可能有權(quán)訪問單個(gè)數(shù)據(jù)存儲(chǔ)區(qū)時(shí),可以使用該語義。使用 WorkflowPersistenceService 類,您可以通過以下方法支持工作流引擎的這一功能:向指定是否應(yīng)該在存儲(chǔ)區(qū)解鎖工作流實(shí)例的狀態(tài)信息的 SaveWorkflowInstanceState 提供參數(shù),以及提供解鎖以前鎖定的工作流狀態(tài)信息的 UnlockWorkflowInstanceState 方法。在實(shí)現(xiàn)鎖定的持久性服務(wù)中,對(duì) LoadWorkflowInstanceState 的調(diào)用將鎖定工作流實(shí)例的狀態(tài)信息。 在創(chuàng)建自己的持久性服務(wù)時(shí),如果該服務(wù)不將狀態(tài)信息保存到其數(shù)據(jù)存儲(chǔ)區(qū)或從其數(shù)據(jù)存儲(chǔ)區(qū)加載狀態(tài)信息,則引發(fā) PersistenceException。 工作流運(yùn)行時(shí)引擎需要此行為。
持久性服務(wù)批處理行為 為使用持久性存儲(chǔ)區(qū)來保存工作流狀態(tài)信息的服務(wù)提供了批處理機(jī)制。 在這種情況下,在持久性服務(wù)使用的持久性存儲(chǔ)區(qū)與工作流運(yùn)行時(shí)引擎內(nèi)部狀態(tài)之間保持一致十分重要。您可以將由 IPendingWork 接口定義的功能添加到服務(wù),然后通過將數(shù)據(jù)存儲(chǔ)區(qū)更改作為工作項(xiàng)添加到 WorkBatch,來參與由 WorkflowCommitWorkBatchService 服務(wù)提供的工作流事務(wù)批處理。 有關(guān)更多信息,請(qǐng)參見 SaveCompletedContextActivity 或 SaveWorkflowInstanceState。
復(fù)雜的宿主情形 Windows Workflow Foundation 解決方案部署的一個(gè)可能的情形是創(chuàng)建多個(gè)主機(jī)應(yīng)用程序,每個(gè)應(yīng)用程序都有在不同的桌面和服務(wù)器配置上運(yùn)行的一組不同的服務(wù)。在這種情形下,可能要求在解決方案中定義的一些工作流只能在特定的系統(tǒng)上執(zhí)行。 Windows Workflow Foundation 中全新的服務(wù)(如 SqlWorkflowPersistenceService 服務(wù))不支持這種配置。 若要控制在哪些系統(tǒng)上加載哪些工作流實(shí)例,必須創(chuàng)建自定義持久性服務(wù)。 有關(guān)更多信息,請(qǐng)參見創(chuàng)建自定義持久性服務(wù)。
Windows 工作流跟蹤服務(wù) 使用 Windows Workflow Foundation 可以以一致、可靠而靈活的方式跟蹤與工作流相關(guān)的信息。 Windows Workflow Foundation 跟蹤框架旨在使宿主通過捕獲工作流執(zhí)行期間引發(fā)的事件,而在執(zhí)行期間可以觀察到工作流實(shí)例。 此框架為可插入式設(shè)計(jì),使宿主可以編寫自己的跟蹤服務(wù),也可以使用現(xiàn)成可用的或第三方跟蹤服務(wù)。此外,由于使用 Windows Workflow Foundation 運(yùn)行時(shí)引擎可以在其生存期過程中添加多個(gè)運(yùn)行時(shí)服務(wù),因此可以同時(shí)啟用多個(gè)不同類型的跟蹤服務(wù)。例如,Windows Workflow Foundation 包含一個(gè)現(xiàn)成可用的 SqlTrackingService 服務(wù),此服務(wù)將數(shù)量可配置的跟蹤信息寫入 SQL Server 數(shù)據(jù)庫。 Windows Workflow Foundation 示例還包含一個(gè)示例 ConsoleTrackingService Sample,用于偵聽事件和這些事件向控制臺(tái)輸出的內(nèi)容。 可以將這兩個(gè)服務(wù)一起運(yùn)行,以使最終用戶可以查看工作流執(zhí)行,并在開發(fā)過程中生成調(diào)試信息。 Windows Workflow Foundation 中的跟蹤功能Windows Workflow Foundation 內(nèi)置多種功能,使得在啟用工作流的應(yīng)用程序中可以進(jìn)行跟蹤。
跟蹤配置文件跟蹤服務(wù)通過使用跟蹤配置文件篩選數(shù)據(jù),從而確定接收的數(shù)據(jù)量。 跟蹤服務(wù)可以接收工作流事件、活動(dòng)執(zhí)行狀態(tài)和自定義用戶跟蹤數(shù)據(jù)項(xiàng)。工作流實(shí)例在運(yùn)行的時(shí)候,跟蹤服務(wù)負(fù)責(zé)跟蹤其從運(yùn)行時(shí)引擎接收的數(shù)據(jù)。 此服務(wù)可以在文件或數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù)、在內(nèi)存中創(chuàng)建查詢存儲(chǔ)區(qū)、將數(shù)據(jù)寫入系統(tǒng)事件日志或僅僅將跟蹤數(shù)據(jù)輸出到控制臺(tái)。 可以使用跟蹤配置文件 XML 架構(gòu)以聲明方式創(chuàng)作跟蹤配置文件,也可以使用跟蹤配置文件對(duì)象模型以編程方式進(jìn)行創(chuàng)作。 此外,還可以使用 TrackingProfileSerializer API 將 XML 格式的跟蹤配置文件反序列化為 TrackingProfile 實(shí)例。 有關(guān)跟蹤配置文件的更多信息,請(qǐng)參見創(chuàng)建和使用跟蹤配置文件。 跟蹤事件類型使用 Windows Workflow Foundation 中的跟蹤時(shí),可以跟蹤工作流執(zhí)行過程中所引發(fā)的單個(gè)事件或事件組。 ActivityExecutionStatus 枚舉中定義了對(duì)于活動(dòng)可以跟蹤的事件: · Initialized · Executing · Canceling · Closed · Compensating · Faulting 除了跟蹤活動(dòng)的事件之外,使用跟蹤基礎(chǔ)結(jié)構(gòu)還可以跟蹤工作流實(shí)例級(jí)別發(fā)生的事件。 TrackingWorkflowEvent 枚舉中定義了可以跟蹤的實(shí)例級(jí)別事件: · Created · Completed · Idle · Suspended · Resumed · Persisted · Unloaded · Loaded · Exception · Terminated · Aborted · Changed · Started 有關(guān)跟蹤單個(gè)事件的信息,請(qǐng)參見創(chuàng)建和使用跟蹤配置文件。 顯式代碼級(jí)別跟蹤生成工作流和任務(wù)的開發(fā)人員可能要以顯式跟蹤事件來檢測其代碼。 只有在跟蹤配置文件無法用于為所需的跟蹤事件檢測運(yùn)行時(shí)的情況下才應(yīng)該這樣做。 工作流創(chuàng)作者可以對(duì) ActivityExecutionContext 使用 TrackData 重載方法之一來跟蹤任何類型的信息。 對(duì)用戶跟蹤點(diǎn)的數(shù)量沒有限制,而對(duì)可以從跟蹤方法發(fā)出的數(shù)據(jù)類型也沒有限制。 在 SqlTrackingService 實(shí)現(xiàn)中,如果傳入 TrackData 方法的第二個(gè)參數(shù)的對(duì)象不能進(jìn)行二進(jìn)制序列化,則所保存的數(shù)據(jù)是調(diào)用該對(duì)象 ToString 方法所得的結(jié)果。 跟蹤僅標(biāo)記工作流借助于僅工作流標(biāo)記的工作流和 Windows Workflow Foundation 跟蹤功能,您可以使用常規(guī)跟蹤配置文件,也可以在啟動(dòng)每個(gè)工作流實(shí)例之前對(duì)此實(shí)例使用 ReloadTrackingProfiles(如果要從此實(shí)例跟蹤特定的事件/項(xiàng))。如果決定使用 ReloadTrackingProfiles,則必須為 XML BLOB 創(chuàng)建工作流實(shí)例、獲取實(shí)例 GUID、生成特定于該實(shí)例的跟蹤配置文件,然后讓實(shí)例重新加載其配置文件。調(diào)用含有實(shí)例 ID 的 GetProfile 時(shí),跟蹤服務(wù)應(yīng)將此配置文件返回到工作流運(yùn)行時(shí)引擎。 這是實(shí)例與配置文件之間發(fā)生關(guān)聯(lián)的地方。 跟蹤規(guī)則執(zhí)行 RuleSet 時(shí),將向在宿主上配置的跟蹤服務(wù)發(fā)送跟蹤事件,這些宿主已通過向其跟蹤配置文件添加 UserTrackPoint 注冊(cè)了這些事件。 將發(fā)送 RuleActionTrackingEvent,其中提供了已計(jì)算的規(guī)則的名稱以及條件計(jì)算結(jié)果 (true/false)。 有關(guān)更多信息,請(qǐng)參見 RuleActionTrackingEvent Sample。 通過跟蹤活動(dòng)執(zhí)行情況,可以隱式地跟蹤活動(dòng)上的規(guī)則條件的計(jì)算結(jié)果。 自定義跟蹤服務(wù)Windows Workflow Foundation 包含 SqlTrackingService 服務(wù),該服務(wù)可用于跟蹤存儲(chǔ)在 SQL Server 數(shù)據(jù)庫中的數(shù)據(jù)。但是,由于 Windows Workflow Foundation 使用了擴(kuò)展性模型,因此可以創(chuàng)建使用如本地文件等各種存儲(chǔ)介質(zhì)的自定義跟蹤服務(wù),這是因?yàn)檫\(yùn)行時(shí)引擎不關(guān)心數(shù)據(jù)的最終目標(biāo)或交付格式。有關(guān)如何創(chuàng)建自定義跟蹤服務(wù)的更多信息,請(qǐng)參見創(chuàng)建自定義跟蹤服務(wù)。
4 補(bǔ)償概述 補(bǔ)償是由于工作流中其他位置發(fā)生異常而做出的一種行為,這種行為撤消由成功完成的可補(bǔ)償活動(dòng)所執(zhí)行的任何操作。 已完成事務(wù)的 Windows Workflow Foundation 補(bǔ)償模型是一個(gè)處理工作流中發(fā)生的任何業(yè)務(wù)異常并合乎邏輯地撤消已完成事務(wù)的過程。 Windows Workflow Foundation 補(bǔ)償可以是: 未指定異常處理程序或未處理特定異常時(shí),默認(rèn)為隱式。 使用 CompensateActivity 活動(dòng)時(shí)為顯式。
5 本地通信和關(guān)聯(lián)概述 宿主進(jìn)程可以通過經(jīng)由自定義本地通信服務(wù)交換數(shù)據(jù)來與工作流進(jìn)行通信。 這些本地通信服務(wù)實(shí)現(xiàn)了一些用戶定義的接口,這些接口定義了將在工作流和宿主進(jìn)程之間進(jìn)行傳遞的方法和事件。 通過使用在宿主進(jìn)程和工作流之間作為事件參數(shù)傳遞的唯一 ID,宿主進(jìn)程還可以在特定的工作流實(shí)例中與特定的活動(dòng)進(jìn)行交互。 這稱為“關(guān)聯(lián)”。 Windows Workflow Foundation 支持工作流的承載環(huán)境中的本地通信服務(wù)和 Web 服務(wù)通信。 Windows Workflow Foundation 通信服務(wù)使工作流能夠使用方法和事件通過消息與外部系統(tǒng)交互。 事件用于將數(shù)據(jù)發(fā)送到工作流,而工作流使用方法將數(shù)據(jù)發(fā)送到主機(jī)應(yīng)用程序。 通過事件與工作流進(jìn)行通信的功能提供了一種將數(shù)據(jù)發(fā)送到工作流的異步方式。
在工作流中使用本地服務(wù) Windows Workflow Foundation 工作流通信服務(wù)向工作流編寫器公開用戶定義的服務(wù)類,作為方法調(diào)用和事件處理程序,以簡化出站和入站消息交換的建模。 單個(gè)服務(wù)類實(shí)例到多個(gè)工作流實(shí)例的多路復(fù)用允許主機(jī)編寫器對(duì)出站消息的單個(gè)位置進(jìn)行編程,而引發(fā)事件時(shí)仍針對(duì)特定工作流實(shí)例。 下圖演示本地通信服務(wù)如何與其主機(jī)應(yīng)用程序通信。
工作流實(shí)例上的 HandleExternalEventActivity 和 CallExternalMethodActivity 活動(dòng)與在自定義接口中聲明并在自定義本地服務(wù)中實(shí)現(xiàn)的事件和方法交互。 HandleExternalEventActivity 活動(dòng)響應(yīng)由主機(jī)應(yīng)用程序引發(fā)且由本地服務(wù)實(shí)現(xiàn)的特定事件。 CallExternalMethodActivity 對(duì)本地服務(wù)調(diào)用方法。 工作流通信服務(wù) Windows Workflow Foundation 工作流通信服務(wù)實(shí)現(xiàn)一種供對(duì)象與工作流實(shí)例通信的簡單機(jī)制。通信通道的定義是一個(gè)接口,其實(shí)現(xiàn)是添加到運(yùn)行時(shí)以方便通信的服務(wù)類。對(duì)于服務(wù)類,工作流的行為很像任何其他類,您通過引發(fā)事件和接收方法調(diào)用與其通信。 對(duì)于工作流,通信接口顯示為包含入站事件接收和出站操作方法調(diào)用的通道。ExternalDataExchangeService 將接口上的外部方法聲明轉(zhuǎn)換為服務(wù)對(duì)象上的方法調(diào)用。 我們可以視為本地服務(wù)的類能夠引發(fā)事件,工作流運(yùn)行時(shí)引擎截獲這些事件并將其作為工作流的入站消息加以傳送。 下面的代碼示例演示如何定義本地工作流通信接口的示例。 [ExternalDataExchange] public interface ICommunicationService { void HelloHost(string message); event EventHandler<ExternalDataEventArgs> HelloWorkflow; }
服務(wù)類 服務(wù)類實(shí)現(xiàn)用于定義與工作流進(jìn)行通信的接口。 接口上的所有事件都是單向的,也就是說,這些事件沒有 ref 或 out 參數(shù),并且沒有返回值。 但是,對(duì)于傳出請(qǐng)求,接口上的方法可以具有 ref 和 out 參數(shù),并且有返回值。 通信模型為多對(duì)一:有很多工作流實(shí)例,每個(gè)實(shí)例可以使用此單一實(shí)例服務(wù)對(duì)象在很多會(huì)話上傳遞。這意味著對(duì)所有工作流中的特定方法 m 的所有出站調(diào)用由同一個(gè)對(duì)象上的同一個(gè) m 提供服務(wù)。相反,所有入站調(diào)用必須顯式定向到正確的工作流實(shí)例和會(huì)話。 Windows Workflow Foundation 為 m 提供一種機(jī)制以區(qū)別出站調(diào)用的工作流實(shí)例和會(huì)話。 使用這兩段信息,對(duì)象可以將響應(yīng)定向回正確的工作流實(shí)例上的正確的會(huì)話。 Windows Workflow Foundation 在出站調(diào)用線程上的 System.Workflow.Runtime.WorkflowEnvironment.WorkflowInstanceId 中提供調(diào)用工作流的實(shí)例標(biāo)識(shí)符。 下 面的代碼示例演示通信服務(wù)實(shí)現(xiàn)。 public class CommunicationService : ICommunicationService { public event EventHandler<ExternalDataEventArgs> HelloWorkflow;
public void HelloHost(string message) { Console.WriteLine("This is the message: {0}", message);
// Raise the HelloWorkflow event. HelloWorkflow(null, new ExternalDataEventArgs(WorkflowEnvironment.WorkflowInstanceId)); } }
您啟動(dòng)工作流的實(shí)例之前,必須將 ExternalDataExchangeService 添加到工作流運(yùn)行時(shí)引擎,然后將自定義通信服務(wù)添加到 ExternalDataExchangeService,如下面的代碼示例所示。 ExternalDataExchangeService externalService = new ExternalDataExchangeService(); workflowRuntime.AddService(externalService); externalService.AddService(new CommunicationService());
在工作流中使用關(guān)聯(lián) Windows Workflow Foundation 運(yùn)行時(shí)引擎使用關(guān)聯(lián)將入站消息映射到某個(gè)工作流實(shí)例中的特定 HandleExternalEventActivity 活動(dòng)。 對(duì)實(shí)例的映射是在將工作流實(shí)例 InstanceId 傳遞到 ExternalDataEventArgs 構(gòu)造函數(shù)時(shí)完成的。通過使用接口屬性來定義關(guān)聯(lián)。 Windows Workflow Foundation 工作流通信服務(wù)接口可以為關(guān)聯(lián)指定附加的元數(shù)據(jù)。 關(guān)聯(lián)某個(gè)工作流實(shí)例的事件活動(dòng)時(shí)需要此關(guān)聯(lián)數(shù)據(jù)。 關(guān)聯(lián)元數(shù)據(jù)規(guī)范采用接口屬性的形式,即 CorrelationParameterAttribute 屬性。 注意: 為通信接口提供關(guān)聯(lián)屬性是可選的。 默認(rèn)情況下,通信接口都是無關(guān)聯(lián)的。 用戶只有在需要使用關(guān)聯(lián)將消息傳遞給特定活動(dòng)實(shí)例時(shí)才應(yīng)添加關(guān)聯(lián)屬性。 接口屬性 下表描述在可供 Windows Workflow Foundation 工作流通信服務(wù)使用的接口定義中可以使用的接口屬性全集。
使用相關(guān)屬性 CorrelationParameterAttribute 命名對(duì)話標(biāo)識(shí)符和關(guān)聯(lián)。 然后,使用該名稱的形參對(duì)接口上的每個(gè)方法或事件進(jìn)行聲明(例如 id),如下面的 ITaskService 接口代碼示例所示。 也可以使用其他屬性來說明更復(fù)雜的相關(guān)映射。 當(dāng)實(shí)例和相關(guān)信息已為某個(gè)對(duì)話所了解時(shí),該類將引發(fā)其本地服務(wù)事件。它在調(diào)用上的參數(shù)數(shù)據(jù)中指定關(guān)聯(lián)。 下面的代碼演示與接口定義相關(guān)的工作流通信服務(wù) ITaskService。 [Serializable] public class TaskEventArgs : ExternalDataEventArgs { private string id;
public TaskEventArgs(Guid instanceId,string id) :base(instanceId) { this.id = id; }
public string Id { get { return id; } set { id = value; } } }
[ExternalDataExchange] [CorrelationParameter("taskId")] public interface ITaskService { [CorrelationInitializer] void CreateTask(string taskId, string assignee, string text);
[CorrelationAlias("taskId", "e.Id")] event EventHandler<TaskEventArgs> TaskCompleted; }
任何啟動(dòng)新對(duì)話的操作、方法或事件必須具有 CorrelationInitializerAttribute 屬性。 如果發(fā)生對(duì) CorrelationInitializerAttribute 方法 m 的調(diào)用,則服務(wù)類能了解該調(diào)用正在初始化新對(duì)話。 工作流對(duì)話生存期由相關(guān)引用的生存期指示。 工作流可以在對(duì)話之間卸載或加載。 下面的代碼示例演示實(shí)現(xiàn) ITaskService 的服務(wù)類。 public class TaskService : ITaskService { public void CreateTask(string taskId, string assignee, string text) { Console.WriteLine("task " + taskId + " created for " + assignee); }
public void RaiseEvent(TaskEventArgs args) { if (TaskCompleted != null) TaskCompleted(null, args); }
public event EventHandler<TaskEventArgs> TaskCompleted; }
6 持久性概述 Windows Workflow Foundation 簡化了有狀態(tài)的、長期運(yùn)行的持久性工作流應(yīng)用程序的創(chuàng)建過程。 工作流運(yùn)行時(shí)引擎管理工作流的執(zhí)行情況,而且允許工作流長期保持活動(dòng)狀態(tài)并在應(yīng)用程序重新啟動(dòng)之后存在。這種持久性是 Windows Workflow Foundation 的關(guān)鍵原則。 它意味著可以在等待輸入時(shí)從內(nèi)存中卸載工作流,而且工作流可以序列化為持久性存儲(chǔ)(如 SQL 數(shù)據(jù)庫或 XML 文件)。 只要收到了輸入,工作流運(yùn)行時(shí)引擎就會(huì)將工作流狀態(tài)信息重新加載到內(nèi)存中并繼續(xù)執(zhí)行工作流。 Windows Workflow Foundation 提供的 SqlWorkflowPersistenceService 可以與 Microsoft SQL Server 2005 Express、SQL Server 2000(或更高版本)或 SQL Server 2000 Desktop Engine (MSDE) 很好地集成,以便方便而又高效地保持工作流信息。 您還可以通過從 WorkflowPersistenceService 基類派生來創(chuàng)建自己的持久性服務(wù),以便按照所需的方式存儲(chǔ)工作流狀態(tài)信息。
7 跟蹤概述 “跟蹤”是一項(xiàng)功能,用于指定并捕獲有關(guān)工作流實(shí)例的信息,并在這些實(shí)例執(zhí)行時(shí)存儲(chǔ)該信息。 Windows Workflow Foundation 提供了 SqlTrackingService 這一跟蹤服務(wù),該服務(wù)使用 SQL 數(shù)據(jù)庫來存儲(chǔ)所收集的跟蹤信息。您也可以編寫自己的跟蹤服務(wù)來收集該信息,并以您應(yīng)用程序需要的任何格式將其存儲(chǔ)下來。 創(chuàng)建新工作流時(shí),該跟蹤服務(wù)會(huì)請(qǐng)求一個(gè)要與該工作流相關(guān)聯(lián)的跟蹤通道。 之后,會(huì)將該工作流中的所有跟蹤信息發(fā)送到該跟蹤通道。 該跟蹤服務(wù)可以跟蹤三種類型的事件:工作流實(shí)例事件、活動(dòng)事件和用戶事件。 通過提供跟蹤配置文件,您可以配置您的服務(wù)要為特定工作流實(shí)例或特定類型的工作流接收的信息類型和數(shù)量。 跟蹤框架還能夠在事件期間提取與活動(dòng)或工作流相關(guān)的信息。 如果需要跟蹤活動(dòng)或工作流中的特定屬性或字段,您可以在跟蹤配置文件的提取節(jié)中提供此信息,將在指定事件期間提取該信息。
8 序列化概述 對(duì)工作流、活動(dòng)和規(guī)則可以進(jìn)行序列化和反序列化。 這樣就可以保持它們,在工作流標(biāo)記文件中使用它們,以及在工作流設(shè)計(jì)器中查看其屬性、字段和事件。 Windows Workflow Foundation 為標(biāo)準(zhǔn)活動(dòng)提供了默認(rèn)的序列化功能,您也可以為自定義活動(dòng)創(chuàng)建自己的序列化功能。例如,利用自定義活動(dòng)序列化程序,可以決定對(duì)哪些成員進(jìn)行序列化以及如何對(duì)其進(jìn)行序列化。 這也將確定這些成員在工作流設(shè)計(jì)器中是可見還是隱藏。
9 工作流更改概述 使用 Windows Workflow Foundation,可以在運(yùn)行時(shí)動(dòng)態(tài)更新工作流實(shí)例和聲明性規(guī)則。在計(jì)劃待執(zhí)行的活動(dòng)之前,可以更改預(yù)期行為、流控制等。 使用該功能,可以修改業(yè)務(wù)處理邏輯,且不必重新編譯和重新啟動(dòng)工作流。
10 “規(guī)則和條件”概述 Windows Workflow Foundation 可將業(yè)務(wù)邏輯作為規(guī)則或條件來實(shí)現(xiàn)。 IfElseBranchActivity、ConditionedActivityGroup、WhileActivity 和 ReplicatorActivity 活動(dòng)使用條件來控制活動(dòng)的執(zhí)行。 條件可以聲明方式表示,也可以在代碼中定義。 聲明性條件以代碼 DOM 語句的形式在規(guī)則的 XML 文件中創(chuàng)建。 基于代碼的條件可引用工作流的代碼文件中的一個(gè)方法,該方法通過 Result 屬性返回其結(jié)果。 與條件一樣,規(guī)則以代碼 DOM 語句的形式表示,并收集到規(guī)則的 XML 文件中。 規(guī)則包含一個(gè)條件語句和一些操作集合,這些集合中的操作是根據(jù)條件的結(jié)果來執(zhí)行的。規(guī)則將會(huì)收集到規(guī)則集中,規(guī)則集既支持規(guī)則的簡單依序執(zhí)行,也支持規(guī)則的復(fù)雜正向鏈接。 規(guī)則集由 PolicyActivity 活動(dòng)執(zhí)行。 使用規(guī)則和聲明性條件定義邏輯的一個(gè)主要優(yōu)點(diǎn)是,通過使用工作流更改來執(zhí)行動(dòng)態(tài)更新,可在運(yùn)行時(shí)修改這些規(guī)則和聲明性條件。 此外,規(guī)則使您可將業(yè)務(wù)邏輯與工作流分開,以便與其他工作流共享這些規(guī)則。最后,通過在規(guī)則中定義業(yè)務(wù)邏輯,可在對(duì)象模型之上構(gòu)建高級(jí)工具,如依賴關(guān)系可視化工具和影響分析工具。
11 錯(cuò)誤處理概述 工作流運(yùn)行時(shí)引擎在一個(gè)稱為“錯(cuò)誤處理”的進(jìn)程中異步處理活動(dòng)中所出現(xiàn)的異常。 異常被安排在隊(duì)列中以便日后處理。 如果異常類型與特定 FaultHandlerActivity 活動(dòng)所處理的類型相符,則該活動(dòng)將處理此異常。 如果無法處理異常,則通過父活動(dòng)向上冒泡,直到最終導(dǎo)致工作流實(shí)例終止。 Windows Workflow Foundation 中的錯(cuò)誤處理指的是以異步方式處理異常。這意味著工作流運(yùn)行時(shí)引擎會(huì)捕獲在活動(dòng)中(顯式或隱式)引發(fā)的異常,然后將其安排在隊(duì)列中以便以后處理。 這與常規(guī)異常處理不同,因?yàn)樵诔R?guī)異常處理中,如果異常是在 try 塊中引發(fā)的,則它可以由相應(yīng)的 catch exception 塊捕獲,也可以立即對(duì)用戶引發(fā)。 異常的原因 在工作流中,異??赡芡ㄟ^下列方式生成: TransactionScopeActivity 或 CompensatableTransactionScopeActivity 中的事務(wù)超時(shí)。 工作流通過使用 ThrowActivity 活動(dòng)引發(fā)的顯式異常。 有關(guān)更多信息,請(qǐng)參見使用 ThrowActivity 活動(dòng)。 從代碼活動(dòng)的處理程序或自定義活動(dòng)的代碼旁置引發(fā)的 .NET Framework 異常。 從庫或在工作流中使用的組件等外部代碼引發(fā)的異常。 捕獲異常 在錯(cuò)誤處理中,如果引發(fā)異常的活動(dòng)不能處理異常,則該異常將被傳輸?shù)狡涓富顒?dòng)以進(jìn)行解決。 在處理異?;蚬ぷ髁鬟\(yùn)行時(shí)引擎終止工作流實(shí)例之前,該異常將被傳輸?shù)焦ぷ髁鲗哟谓Y(jié)構(gòu)中。 異常由 FaultHandlerActivity 活動(dòng)來處理。 每個(gè) FaultHandlerActivity 活動(dòng)都與 .NET Framework 異常類型相關(guān)聯(lián),并且如果引發(fā)的異常與該異常類型匹配,則該活動(dòng)還包含一組所執(zhí)行的活動(dòng)。 FaultHandlerActivity 活動(dòng)是包含 0-n 個(gè) FaultHandlerActivity 活動(dòng)的 FaultHandlersActivity 活動(dòng)的父級(jí)。 FaultHandlersActivity 可以是任何復(fù)合活動(dòng)的子活動(dòng)。 Windows Workflow Foundation 中錯(cuò)誤處理的目標(biāo)是撤消已發(fā)生異常的活動(dòng)的部分工作及不成功的工作。 FaultHandlerActivity 活動(dòng)的完成從不被視為其相關(guān)活動(dòng)的成功完成。 這意味著,當(dāng)執(zhí)行 FaultHandlerActivity 活動(dòng)時(shí),引發(fā)異常的活動(dòng)被置于錯(cuò)誤狀態(tài)。當(dāng) FaultHandlerActivity 活動(dòng)完成時(shí),相關(guān)聯(lián)的活動(dòng)被置于關(guān)閉狀態(tài)。 此外,相關(guān)聯(lián)活動(dòng)的任何同級(jí)活動(dòng)(如 ParallelActivity 活動(dòng)的其他子級(jí))被置于取消狀態(tài),然后置于關(guān)閉狀態(tài)。它們永遠(yuǎn)不會(huì)成功執(zhí)行。 錯(cuò)誤處理與補(bǔ)償 錯(cuò)誤處理與補(bǔ)償之間的區(qū)別是,補(bǔ)償只能對(duì)已成功完成的活動(dòng)執(zhí)行,不能對(duì)引發(fā)異常和處于錯(cuò)誤狀態(tài)的活動(dòng)執(zhí)行;但是,在與引發(fā)異常的活動(dòng)相關(guān)聯(lián)的 FaultHandlerActivity 活動(dòng)內(nèi)可以執(zhí)行 CompensateActivity 活動(dòng)。 例如,補(bǔ)償處理的典型情形是,一項(xiàng)活動(dòng)成功完成,但在工作流后面的另一活動(dòng)中引發(fā)異常。該活動(dòng)的錯(cuò)誤處理程序包含一個(gè) CompensateActivity,后者可撤消在工作流中以前完成的任何操作。 若要對(duì)此進(jìn)行進(jìn)一步擴(kuò)展,您可能要在工作流后面由另一活動(dòng)引發(fā) ItemDiscontinuedException 之后向客戶退款。
12 工作流標(biāo)記概述 基于可擴(kuò)展應(yīng)用程序標(biāo)記語言 (XAML) 的工作流標(biāo)記可以使開發(fā)人員和設(shè)計(jì)人員以聲明方式為業(yè)務(wù)邏輯建模,并將其與由代碼旁置文件建模的低級(jí)實(shí)現(xiàn)細(xì)節(jié)區(qū)分開。因?yàn)楣ぷ髁骺梢月暶鞣绞浇#钥梢栽谶\(yùn)行時(shí),通過直接將工作流標(biāo)記文件加載到工作流運(yùn)行時(shí)引擎的方式來激活工作流。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|