在WF4中,工作流定义更改后加载已持久化的工作流程

8

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

我用xaml创建了一个工作流,并启动了多个实例,我有一个持久化存储器,所有的工作流都在其工作流程的一半处进行书签持久化。

现在我停止了应用程序

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

但是,如果我想在运行实例持久化后更改工作流定义,唯一找到的加载正在运行的工作流的方法是以下方式:

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

        wfapp.Load(wfGuid);

如果工作流定义在持久化期间发生了更改,那么情况会变得非常糟糕。因此,您需要解决这个问题。

最好的解决方法是什么?


1
顺便提一下,这种情况是WF4未来的主题之一。请查看来自MIX 10的此演示文稿:http://channel9.msdn.com/Events/PDC/PDC10/FT08 - user1228
5个回答

3
这个场景有点棘手。没有办法将旧的工作流定义迁移到新格式。我做了一些有限的测试,对于尚未执行的添加/删除活动的一些场景效果良好。但是,我也遇到了一些糟糕的情况,包括重新执行已经完成的活动。
据我所知,除了跟踪用于创建工作流的XAML/程序集版本并在想要重启工作流时检查该版本以确定要使用的工作流版本之外,没有更好的解决方法。


2
许多版本的同一工作流需要共存。我的意思是,旧实例必须使用旧工作流版本完成,而新实例必须开始使用新工作流版本。 在我的情况下,我们有工作流服务。它是一个配置,其中路由器描述实例尝试执行的顺序。如果一个实例无法使用一个版本开始工作,则尝试下一个版本,以此类推。
另外,如果您的更改不涉及工作流变量、暴露的合同等方面,旧和新的工作流实例版本可以在同一工作流版本上运行。您可以通过测试来验证这一点。

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

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接