workflow4.0持久化


WF4中的持久化模型有了很大的變化。 sql

SqlWorkflowInstanceStore是WF提供給咱們的開箱即用的類,它會將工做流數據保存到SQL Server 2005或是2008中。該類從InstanceStore類繼承,
若是你要實現本身的持久性功能就須要實現該類的子類。 數據庫

咱們能夠用SqlWorkflowInstanceStore來作什麼?express

咱們能夠將它附加到一個WorkflowApplication或一個WorkflowServiceHost上,在咱們須要的時候來持久化工做流。注意WorkflowInvoker是不支持持久化的。 app

下面是在WorkflowApplication中使用的例子:dom

var instanceStore = new SqlWorkflowInstanceStore(connStr);ide

WorkflowApplication app = new WorkflowApplication(workflow);函數

app.InstanceStore = instanceStore;blog

app.Run();
 繼承

首先你須要存儲工做流狀態的數據庫,在ip

「C:\Windows\Microsoft.NET\Framework\v4.0.21006\SQL\en」文件夾下有一些SQL文件,SqlWorkflowInstanceStoreSchema.sql 和SqlWorkflowInstanceStoreLogic.sql持久化須要的,能夠建立了一個批處理文件來快速從新建立數據庫,以下:

osql -E -S .\sqlexpress -Q "Drop Database WorkflowInstanceStore"

osql -E -S .\sqlexpress -Q "Create Database WorkflowInstanceStore"

osql -E -S .\sqlexpress -d WorkflowInstanceStore -i SqlWorkflowInstanceStoreSchema.sql

osql -E -S .\sqlexpress -d WorkflowInstanceStore -i SqlWorkflowInstanceStoreLogic.sql

 


咱們須要告訴WorkflowApplication何時持久化工做流,有不少種方式可使用,其中一種就是使用PersistableIdle回調函數,它在工做流Idle而且容許持久化時激發。咱們能夠持久化並卸載工做流,也能夠只卸載工做流。以下:
app.PersistableIdle = e => PersistableIdleAction.Persist; 

還有一種方式就是使用Persist活動,他能夠容許在其餘的持久化點來持久化工做流,無論工做流是否處於Idle狀態。 

在WorkflowServiceHost中如何使用?

在WorkflowServiceHost中使用有一些不一樣,首先建立一個SqlWorkflowInstanceStore 實例,並設置以下:

var workflow = new Workflow1();

var baseAddress = new Uri("http://localhost:8080/MyWorkflow");

var host = new WorkflowServiceHost(workflow, baseAddress);

 

var connStr = @"Data Source=.\sqlexpress;Initial Catalog=WorkflowInstanceStore;Integrated Security=True;Pooling=False";

var instanceStore = new SqlWorkflowInstanceStore(connStr);

host.DurableInstancingOptions.InstanceStore = instanceStore;  

host.Open();  

Console.WriteLine("Listening...");

Console.ReadLine();

host.Close();

 

代碼很簡單,可是當工做流持久化時咱們不能作任何的控制,能作的僅僅是使用WorkflowIdleBehavior來設置一些timeout的值以下:

var workflowIdleBehavior = new WorkflowIdleBehavior();

workflowIdleBehavior.TimeToPersist = TimeSpan.FromSeconds(10);

workflowIdleBehavior.TimeToUnload = TimeSpan.FromMinutes(1);

host.Description.Behaviors.Add(workflowIdleBehavior);
 

若是咱們想要經過一些方式對SqlWorkflowInstanceStore行爲進行更多的控制。咱們可使用SqlWorkflowInstanceStoreBehavior。下面使用類的方式也能夠經過配置文件完成:

var connStr = @"Data Source=.\sqlexpress;Initial Catalog=WorkflowInstanceStore;Integrated Security=True;Pooling=False";

var behavior = new SqlWorkflowInstanceStoreBehavior(connStr);

behavior.InstanceCompletionAction = InstanceCompletionAction.DeleteNothing;

behavior.InstanceLockedExceptionAction = InstanceLockedExceptionAction.AggressiveRetry;

behavior.InstanceEncodingOption = InstanceEncodingOption.None;

host.Description.Behaviors.Add(behavior);
 

當多個 WorkflowApplication 實例中使用相同的 SqlWorkflowInstanceStore時會有一些複雜。不過在WorkflowServiceHost中會自動負責處理這種狀況。
 

默認狀況下一個SqlWorkflowInstanceStore 將只使用一個單一的 WorkflowApplication。若是您嘗試與多個工做流使用,你會獲得一個InstancePersistenceCommandException 異常,以下:

SqlWorkflowInstanceStore does not support creating more than one lock owner concurrently. Consider setting InstanceStore.DefaultInstanceOwner to share the store among many applications.
 

從上面的信息能夠看出,技巧就是要設置SqlWorkflowInstanceStore的

DefaultInstanceOwner屬性,以下:

var instanceStore = new SqlWorkflowInstanceStore(connStr);

 

var instanceHandle = instanceStore.CreateInstanceHandle();

var createOwnerCmd = new CreateWorkflowOwnerCommand();

var view = instanceStore.Execute(instanceHandle, createOwnerCmd, TimeSpan.FromSeconds(30));

instanceStore.DefaultInstanceOwner = view.InstanceOwner;

 

// Do whatever needs to be dome with multiple WorkflowApplications

var deleteOwnerCmd = new DeleteWorkflowOwnerCommand();

instanceStore.Execute(instanceHandle, deleteOwnerCmd, TimeSpan.FromSeconds(30)); 
 

關鍵是要在開始時執行所需的CreateWorkflowOwnerCommand,當您使用 CreateWorkflowOwnerCommand 時要確保不能忘記最後執行

DeleteWorkflowOwnerCommand ,不然全部工做流讓然還被全部者鎖定,不能從新加載另外一個 SqlWorkflowInstanceStore。 

能夠看出,WF4中的持久性比之前更靈活。 

譯者注:

1.       Beta2中使用SqlWorkflowInstanceStore 和 InstanceStore 取代了Beta1中的

SqlPersistenceProviderFactory 和 PersistenceProviderFactory。

2. PersistableIdleAction枚舉有三個值:None,Unload,Persist。

做者: 生魚片
         
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。
相關文章
相關標籤/搜索