2010-01-14 62 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中找到它,這個元素太重而不能解析,但好消息是你可以簡單地刪除它。