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