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。

做者: 生鱼片
         
本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。
相关文章
相关标签/搜索