【问题标题】:Loading persisted workflow after workflowdefinition has changed in WF4在 WF4 中更改工作流定义后加载持久的工作流
【发布时间】:2010-01-14 13:59:36
【问题描述】:

如何解决这个问题(在 WF4 中):

我在 xaml 中创建了一个工作流并启动了它的多个实例,我有一个持久存储,并且所有工作流都在其工作流的一半中保留在一个书签上。

现在我停止应用程序

如果我重新启动应用程序,一切都会恢复,很好地完成。

但是如果我想在运行的实例持续存在后更改工作流定义怎么办?加载正在运行的工作流(我能够找到)的唯一方法是:

        WorkflowApplication wfapp = new WorkflowApplication(new WorkflowDefinition());
        wfapp.InstanceStore = new SqlWorkflowInstanceStore(connStr);

        wfapp.Load(wfGuid);

所以你需要工作流定义,如果它在持久化期间发生了变化,事情就会大错特错。

解决这个问题的最佳方法是什么?

【问题讨论】:

标签: workflow-foundation workflow-foundation-4


【解决方案1】:

这种情况有点问题。无法将旧的工作流定义迁移到新格式。我已经完成了一些有限的测试和一些添加/删除尚未执行的活动的场景。但是我也遇到了严重错误的场景,包括重新执行已经完成的活动。

据我所知,除了跟踪用于创建工作流的 XAML/程序集的版本并检查您何时要重新启动工作流以确定要使用的工作流版本之外,没有其他解决问题的好方法.

【讨论】:

    【解决方案2】:
    【解决方案3】:

    同一工作流程的多个版本必须共存。我的意思是,旧实例必须以旧工作流版本结束,而新实例必须以新工作流版本开始。 就我而言,我们有工作流服务。在配置中,路由器描述了实例尝试执行的顺序。如果一个实例无法使用一个版本开始工作,则尝试下一个版本,依此类推。

    此外,如果您的更改不涉及工作流变量、公开合同等的更改...新旧工作流实例版本可以在相同的工作流版本上运行。你会知道的,测试它。

    【讨论】:

      【解决方案4】:

      这不是 Windows 工作流的问题,因为它是 SQL 持久性服务。您可以创建自己的持久性服务来处理这种情况,或者通过支持将旧工作流转换为新工作流或更抽象的东西,比如序列化为 XML/JSON 的持久性服务,这可能更容易支持反序列化一个版本作为另一个版本。

      【讨论】:

        【解决方案5】:

        在 WF4 中更改定义后可以加载持久化的 wf 实例 - 您必须解析和更改 wf 引擎存储的 xml 文件。您应该创建两个相同的工作流程:使用旧版本和新版本并比较它们以消除差异。必须对定义 xml 和用于存储工作流状态的复杂数据 xml 执行此操作。使用 LinqToXML 解析它会节省大量时间,并且您必须确保检查了所有差异 - 如果还剩下一个差异,则 wf 将无法加载。 有一个元素“ResumeData”,你可以在 wf 状态 xml 中找到它,它太重而无法解析,但好消息是你可以简单地删除它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多