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

标签 workflow workflow-foundation

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

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

最佳答案

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

第一个选项是使用 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 以及它自己的数据库,这增加了复杂性和开销。

关于多个工作流程的工作流程持久性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1296002/

相关文章:

c# - 获取放置在重新托管的工作流设计器上的所有事件的列表

.net - 工作流编辑器/设计器是否有任何免费可用的组件?

netbeans - 使用 Mercurial 和 Netbeans 组织工作流程(+ bitbucket.org?)

replace - 用于替换引号的 Sublime Workflow

.net - 运行WF 4.0工作流程的动态更新

c# - 如何使 UiPath 自定义事件看起来不错?

build-automation - 无法在自定义构建过程模板中删除 TFS2010 的自定义工作流事件

c# - c# 中方法的菜单

exception - 如何处理jbpm工作流程中的错误或异常

version-control - Mercurial 工作流 - 我什么时候可以 rebase ,什么时候应该 merge ?