天天看點

【轉】工作流持久化的幾點說明

WF工作流執行個體持久化(鈍化)在工作流項目中相當的重要,在實際業務中幾乎所有的業務流都需要較長時間才能執行完畢,這樣就需要把未完成的業務流持久化到資料庫或者檔案中。

WF自身提供了SqlWorkflowPersistenceService服務以支援執行個體持久化。

public SqlWorkflowPersistenceService( string connectionString, bool unloadOnIdle, TimeSpan instanceOwnershipDuration, TimeSpan loadingInterval )

參數說明:

connectionString:資料庫連接配接字元串

unloadOnIdle:是否啟用自動鈍化

instanceOwnershipDuration:鎖定持續時間

loadingInterval:引擎輪詢檢測時間間隔

對資料庫連接配接字副串就不需要多講了,關鍵在後面三個參數。

unloadOnIdle在我們目前看到MS提供的例子中都是設為true的,這樣好處是我們不用關心持久化問題,工作流引擎會自動實作( 空閑的時候進行持久化操作)。我一般都是設定為false,通過workflowruntime的Idled事件來完成持久化。

曾經在網上看到有朋友說如果設定為true會産生很操蛋的問題:執行個體一旦被持久化,我們從資料庫retrieve這個執行個體後,就沒有辦法使用了,具體表現 是工作流不能接收調用方發起的事件,經過測試好像不存在這個問題,至少目前沒有發現這個情況(也有可能vs2008 RTM版本附帶的wf已經不存在這個問題)

instanceOwnerShipDuration:這個參數設定了工作流執行個體加載後被引擎鎖定時間,強烈建議不要設定為0,一旦為0就等于不鎖定了, 結果就是誰都可以retrieve這個執行個體,這就違背了workflow的原則(一家之言)。具體時間的長短根據業務類型的不同做适當調整。

loadingInterval:通過它完成系統的自動化操作,具體有那些作用俺也沒有測試出來:(不過不建議設定時間太短,太短會對資料庫造成壓力,從事件探查器可以看到WorkflowRuntime在不挺的通路資料庫。

SqlWorkflowPersistenceService服務主要依賴InstanceState、CompletedScope

InstanceState表記錄了還沒有執行完成的工作流執行個體,CompletedScope協助完成對工資流事務的支援。

InstanceState表字段說明:

uidInstanceID:執行個體Id,建議跟業務單據Id綁定在一起,如果您的系統是用int或者其他類型的主鍵就比較麻煩了。

state:工作流執行個體被持久化的内容,從目前測試的情況看不單純有工作流執行個體的内容,可能還加進去了其他的東東,因為沒有學習如何自定義WorkflowPersistenceService,是以這個字段具體儲存了那些資料還不清楚。

status:狀态,不知道幹啥用的,因為我測試的時候他的值一直是0.

unlocked:測試的時候他的值一直是1.

blocked:執行個體是否被鎖定。

info:一直為空,含義未知

ownerID:執行個體所有者,就是這個執行個體是被“誰”Load的,是workflowruntime跟目前的應用生成的唯一Id。winform應用 host每次加載後的值都是不同的,如果是wcf或者webservice服務host工作流,隻要這些服務不所使用的承載方不重新開機,那麼這個值就是不變 的,一旦重新開機workflowruntime會生成新的ownerID。

ownedUntil:執行個體被所有者持有的到期時間,這個值跟SqlWorkflowPersistenceService中的 instanceOwnershipDuration參數有關聯,執行個體被retrieve的時間加上 instanceOwnershipDuration設定的時間就是 ownedUntil的值。

nextTimer:執行個體失效時間,值一直是9999-12-31 23:59:59,不知道那些動作會影響它。

在workflow項目中一般要進行的操作有:建立工作流,建立工作流執行個體,加載工作流執行個體,調用事件。。。。

在建立工作流、執行個體時, InstanceState表中  blocked為0, ownerID、 ownedUntil都為null;

加載時,blocked為1, ownerID、 ownedUntil都寫入了相應的值不為空了;

如果blocked為0, ownerID、 ownedUntil都為null的執行個體是可以被任何引擎加載的,因為這個狀太下沒有“人”在使用它。

如果blocked為1, ownerID、 ownedUntil不為null,說明這個執行個體已經被某個引擎加載并鎖定了,這樣其他的就不能操作這個執行個體了,如果您強行調用就會報 System.Workflow.Activities.EventDeliveryFailedException 錯, InnerException: System.Workflow.Runtime.QueueException。

如果blocked為1, ownerID、 ownedUntil為null,說明這個已經被重新持久化到資料庫,可以被其他引擎使用了。

下回将做測試用的例子整理一下

轉載于:https://www.cnblogs.com/SingleCat/archive/2009/12/07/1618319.html