在WF4中更改了workflowdefinition后加载持久工作流

时间:2010-01-14 13:59:36

标签: workflow-foundation workflow-foundation-4

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

我在xaml中创建了一个工作流程并启动了它的几个实例,我有一个persistancestore,并且所有工作流程都保留在他们工作流程中间的书签上。

现在我停止了应用程序

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

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

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

        wfapp.Load(wfGuid);

所以你需要工作流程定义,如果它在持久性过程中发生了变化,那么事情就会发生可怕的错误。

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

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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