多个工作流程的工作流程持久性

时间:2009-08-18 19:34:42

标签: workflow workflow-foundation

这似乎是一个基本问题,但我无法在任何地方找到答案:

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

2 个答案:

答案 0 :(得分: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以及它自己的数据库,增加了复杂性和开销。

答案 1 :(得分:0)

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