天天看點

堅持學習WF(13):WF中的持久化服務

<a href="http://www.cnblogs.com/carysun/archive/2008/05/29/WF.html">[置頂]堅持學習WF文章索引</a>

工作流系統中有很大一部分需要和人進行互動,有的時候需要很長的時間,是以我們不可能讓工作流執行個體一直儲存在記憶體當中,這就需要進行持久化操作。工作流的持久化就是儲存工作流的某些狀态資訊到持久化存儲裡,比如sql資料庫,檔案中,一旦被儲存到持久化存儲裡了,工作流就可以從記憶體中移除掉,在需要的時候在進行裝載。

插一句,在Lotus Notes中由于他的設計和資料都是以文檔的形式存儲在一個nsf中的,是以他天生就對持久化支援,隻要我們做簡單的做一個FileSave或是Call doc.Save(True,True)就會被持久存儲,也正是如此,我們很多關于工作流的狀态資訊我們都存儲在每個資料文檔本身當中,可在.Net,Java這些當中卻還需要花費很大的力氣和DB等互動才可以完成,兩種不同風格的開發對比起來确實挺有意思。

持久化服務是WF中核心服務之一,WF架構提供一個标準的持久化服務SqlWorkflowPersistenceService,利用它可以将工作流狀态資訊存放在Sql Server資料庫中,你也可以自己實作持久化服務,你必須繼承自WorkflowPersistenceService這個類,自定義的持久化服務可以把資料存儲在二進制檔案,xml,其他關系型資料庫中等等,但是一個工作流執行個體一次隻能使用一個持久化服務。

一旦你将持久化服務加載到工作流引擎中,你就不需要手動去幹涉了,他會自動的完成相應的操作。在以下狀态的時候,工作流會被持久化。

1. idle的時候(如等待外部事件,使用DelayActivity)。

2. 工作流完成或終止。

3. 當TransactionScopeActivity完成的時候。

4. 當CompensatableSequenceActivity完成的時候。

5. 當一個裝飾有PersistOnCloseAttribute的自定義活動完成的時候。

6. 當你手動的去調用Unload或TryUnload方法的時候。

如果你使用DelayActivity的時候,持久化服務也會存儲DelayActivity的過期時間,并且持久化服務會定期檢查是否過期,以準備從新恢複工作流狀态,SqlWorkflowPersistenceService有一個LoadingInterval屬性可以設定擷取加載間隔的長度。

有的時候當工作流變成idle的時候,你也可以選擇不進行持久化存儲,這種情況适合當你等待的外部事件比較頻繁,而且事件很快就被接收的時候,因為這個時候如果你在進行持久化存儲,你花在解除安裝和裝載上時間會更多,還不如不進行持久化存儲呢。

下面我們完成一個例子來說如何使用SqlWorkflowPersistenceService:

1.首先我們需要建立我們的持久化資料庫,WF已提供了響應sql腳本,位置如下:

[WindowsFolder]\Microsoft.Net\Framework\v3.0\Windows Workflow Foundation\SQL\[language].[windows]這裡面有SqlPersistenceService_Schema.sql和SqlPersistenceService_Logic.sql兩個檔案用來生成持久化資料庫.

建立好的持久化資料庫裡包含兩張表, InstanceState和 CompletedScope,InstanceState表中記錄未完成事例的運作狀态,CompletedScope表記錄當工做流使用事務的支援。

2.定義兩個事件

2.1.首先定義IPersistenceDemo接口:

本文轉自生魚片部落格園部落格,原文連結:http://www.cnblogs.com/carysun/archive/2008/06/25/Persistence.html,如需轉載請自行聯系原作者