Workflow 多工作流的工作流持久性

Workflow 多工作流的工作流持久性,workflow,workflow-foundation,Workflow,Workflow Foundation,这似乎是一个基本问题,但我在任何地方都找不到答案: 我有几种不同类型的长期运行的状态机工作流,我正在使用这些工作流跨多个主机应用程序使用一个中央数据库。我正在使用SqlWorkflowPersistenceService来持久化它们。假设我有三种工作流类型WorkflowOne、WorkflowTwo和WorkflowTwo。每个实例都由一个用户启动并保存到数据库中。另一个用户出现并希望进行各种更改,因此他们启动了应用程序。现在我可以使用持久性服务为我提供所有持久性实例的列表,但我如何知道哪种类

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


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

不确定这是否是最好的方法,但是我只是简单地给每个WF实例加水,然后比较它的Name属性,看看这是否就是我要寻找的实例。

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

第一个选项是使用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);
}
var persistenceService=new-SqlWorkflowPersistenceService(“”);
var persistedWorkflows=persistenceService.GetAllWorkflows();
foreach(persistedWorkflows中的var persistedWorkflow)
{
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);
    }
var trackingQuery=new-SqlTrackingQuery(“”);
var queryOptions=new-SqlTrackingQueryOptions()
{
WorkflowStatus=WorkflowStatus.Running
};
var runningWorkflows=trackingQuery.GetWorkflows(queryOptions);
foreach(runningWorkflows中的var runningWorkflow)
{
Console.WriteLine(runningWorkflow.WorkflowType);
}

其优点是,您不需要将实际的工作流定义加载到内存中,只需检查其类型即可。缺点是您必须添加SqlTrackingService以及它自己的数据库,从而增加复杂性和开销

我会把这件事公开几天,看看是否还有其他人有更好的办法。我也想过创建自己的持久性服务,只是在InstanceState表中添加另一个字段来保存该类型,但我认为这有点过分了。谢谢,Maurice。我基本上实现了第一个选项。第二个使用跟踪的方法更符合我的想法。我认为我们最终可能会使用跟踪,在这种情况下,我将实现该选项。再次感谢!