【问题标题】:How to load runnable instances with multiply workflow definitions from Instance Store when server restart服务器重新启动时如何从 Instance Store 加载具有多个工作流定义的可运行实例
【发布时间】:2024-01-19 01:18:01
【问题描述】:

我正在评估 Workflow Foundation 4 或 4.5,想知道如何在服务器重启时从实例存储中加载具有多个工作流定义的可运行实例?

与论坛主题相同的问题:http://social.msdn.microsoft.com/Forums/en-US/wfprerelease/thread/b8d5ed34-054a-4e55-88e1-cd430ac42110?prof=required

"使用 InstanceStore.WaitForEvents 时,如果任何实例准备就绪,就会引发 HasRunnableWorkflowEvent 事件。而且,要调用 WorkflowApplication.LoadRunnableInstance(),我们需要创建一个新的 WorkflowApplication,它需要正确的工作流定义。它是当只有 1 个工作流实现时很容易。但是,如果有多种类型的工作流与同一个 InstanceStore 关联,并且因为 HasRunnableWorkflowEvent 没有任何关于将由 LoadRunnableInstance() 加载的就绪实例的其他信息,我们可以'不知道我们必须为新的 WorkflowApplication 创建什么类型的实例。”

但答案表明:

唯一的方法是在使用 WorkflowApplication 托管时为每个工作流定义单独存储一个实例。

我错过了什么吗?

【问题讨论】:

    标签: c# .net workflow-foundation-4 workflow-foundation


    【解决方案1】:

    您可以在一个商店中拥有多种工作流定义,但您需要跟踪用于启动工作流的工作流定义。这是你的问题。在我当前的项目中,我们使用以下方法解决了这个问题。

    我们在 WorkflowApplication 类周围使用一个包装类,并使用它来启动工作流。在这个包装器中,在我们实际启动工作流之前,我们在数据库的表中写入一个 WorkflowInstance 记录,我们存储即将运行的 eorkflow 的定义。除了一些其他信息之外,我们还有一个“persisted-id”列,它是由 WorkflowApplication 对象生成的 id。当我们启动工作流时我们不知道这个 id,所以我们将此列留空。当正在运行的工作流实例被持久化(可以通过处理 WorkflowApplication 对象上的事件来通知您),您可以检索由 WorkflowApplication 对象生成的 id。使用persisted-id更新您的WorkflowInstance,当工作流在服务器重启时重新加载时,您可以使用id来检索工作流定义。

    希望这会有所帮助。在这里工作就像一个魅力。

    【讨论】:

    • 非常感谢,马丁。你的回复很有帮助。问题是如何在重新加载时知道它是可运行的实例? (如定时器过期)。还有一个问题是如果你让工作流在空闲时保持并卸载,如何在定时器到期时(例如延迟活动)获取信号而不定期调用WaitForEvents?
    最近更新 更多