2010-01-14 61 views
8

改变后如何解决这个问题(在WF4):加载坚持工作流程workflowdefinition在WF4

我XAML创建一个工作流程,并开始它的几个例子,我有一个persistancestore和所有工作流程坚持一个书签他们工作流程的一半。

现在我停止应用程序

如果我重新启动应用TE一切重新开始,EN很好地完成。

但是如果我想在运行的实例持续后更改工作流定义呢?加载运行的工作流(即我能找到)的唯一方法是通过以下方式:

 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 – Will 2011-04-04 16:07:13

回答

3

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

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

1

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

2

许多相同的工作流程的版本必须共存。我的意思是,旧的实例必须完成旧的工作流版本,而新的实例必须以新的工作流版本开始。 就我而言,我们有工作流服务。这是在路由器描述实例试图执行的顺序的配置上。如果一个实例无法开始使用一个版本,则会尝试下一个版本,依此类推。另外,如果您的更改不涉及工作流变量,合同暴露等的更改......新旧工作流实例版本可以在相同的工作流版本上运行。你会知道,测试它。

1

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