2009-08-18 75 views
2

这似乎是一个基本的问题,但我找不到任何地方的答案:工作流持久性多个工作流

我有几个不同类型的长期运行的状态机工作流的,我与跨多个主机应用工作与中央数据库。我正在使用SqlWorkflowPersistenceService来坚持它们。所以说我有三种工作流类型WorkflowOne,WorkflowTwo和WorkflowThree。每个用户的实例都由一个用户启动并保存到数据库。另一位用户出现并希望进行各种更改,因此他们启动应用程序。现在我可以使用持久性服务给我一个所有持久化实例的列表,但是如何知道哪些是WorkflowOne类型,哪些是WorkflowTwo或WorkflowThree?

回答

4

有几种方法可以做到这一点。

第一种选择是使用WorkflowPersistenceService本身做这样的事情:

var persistenceService = new SqlWorkflowPersistenceService("<<connection string>>"); 
var persistedWorkflows = persistenceService.GetAllWorkflows(); 
foreach (var persistedWorkflow in persistedWorkflows) 
{ 
    var workflowInstance = workflowRuntime.GetWorkflow(persistedWorkflow.WorkflowInstanceId); 
    var workflowDefinition = workflowInstance.GetWorkflowDefinition(); 
    Console.WriteLine(workflowDefinition.GetType().FullName); 
} 

简单,因为已经在使用SqlWorkflowPersistenceService做的,但它具有所有工作流实例加载到内存中,你的缺点负责将它们从内存中移除。

第二个选择是使用工作流程追踪:

var trackingQuery = new SqlTrackingQuery("<<connection string>>"); 
    var queryOptions = new SqlTrackingQueryOptions() 
    { 
     WorkflowStatus = WorkflowStatus.Running 
    }; 
    var runningWorkflows = trackingQuery.GetWorkflows(queryOptions); 
    foreach (var runningWorkflow in runningWorkflows) 
    { 
     Console.WriteLine(runningWorkflow.WorkflowType); 
    } 

的优点是你不需要加载实际的工作流定义到内存只是为了检查它的类型。缺点是你必须添加SqlTrackingService以及它自己的数据库增加了复杂性和开销。

+0

谢谢,莫里斯。我基本上实现了第一个选项。尽管我认为第二个使用跟踪更多的是我。我想我们可能最终会使用跟踪,在这种情况下,我会实施该选项。再次感谢! – 2009-08-19 23:24:29

0

不知道这是否是最好的方式,但只是保湿每个WF实例,然后比较它的Name属性,看看是否是我正在寻找的实例。

+0

我会离开这几天,看看是否有其他人有更好的方法。还想过创建我自己的持久性服务,只是增加另一个字段到InstanceState表来保存类型,但认为这有点矫枉过正。 – 2009-08-18 23:16:18