Загрузка постоянного рабочего процесса после изменения определения рабочего процесса в WF4 - PullRequest
8 голосов
/ 14 января 2010

Как решить эту проблему (в WF4):

Я создаю рабочий процесс в xaml и запускаю несколько его экземпляров, у меня есть хранилище persistancestore, и все рабочие процессы сохраняются в закладке на половине пути их рабочего процесса.

Теперь я останавливаю приложение

Если я перезапущу приложение, все возобновится, и все будет хорошо.

Но что, если я захочу изменить определение рабочего процесса после сохранения запущенных экземпляров? единственный способ загрузить запущенные рабочие процессы (который я смог найти) - это следующий способ:

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

        wfapp.Load(wfGuid);

Так что вам нужно определение рабочего процесса, если оно изменилось за время персистенции, все идет ужасно неправильно.

Как лучше всего это решить?

Ответы [ 5 ]

3 голосов
/ 15 января 2010

Этот сценарий представляет собой небольшую проблему.Нет способа перенести устаревшее определение рабочего процесса в новый формат.Я провел ограниченное тестирование и несколько сценариев с добавлением / удалением действий, которые еще не выполнялись.Но тогда у меня также есть сценарии, которые идут не так, как надо, включая повторное выполнение уже выполненного действия.

Насколько я знаю, нет другого способа решить проблему, кроме отслеживания версии используемой XAML / сборкисоздать рабочий процесс и проверить, когда вы хотите перезапустить рабочий процесс, чтобы определить версию рабочего процесса для использования.

2 голосов
/ 04 апреля 2011

Многие версии одного и того же рабочего процесса должны сосуществовать. Я имею в виду, что старые экземпляры должны заканчиваться старой версией рабочего процесса, а новые должны начинаться с новой версией рабочего процесса. В моем случае у нас есть сервисы рабочих процессов. Именно в конфигурации маршрутизатор описывает порядок, в котором экземпляры пытаются выполняться. Если экземпляр не может начать работать с одной версией, пробуется следующая и т. Д.

Кроме того, если ваше изменение не связано с изменениями переменных рабочего процесса, выставленных контрактов и т. Д. ... старые и новые версии экземпляров рабочего процесса могут работать в одной версии рабочего процесса. Вы узнаете это, проверяя это.

2 голосов
/ 07 апреля 2010

Может быть, это поможет

http://msdn.microsoft.com/en-us/magazine/dd727506.aspx

1 голос
/ 09 января 2014

Можно загрузить сохраненный экземпляр wf после изменения определения в WF4 - вам нужно проанализировать и изменить xml-файлы, которые хранит механизм wf. Вы должны создать два равных рабочих процесса: со старой версией и новой версией и сравнить их, чтобы устранить различия. Это должно быть сделано для определения xml и сложного xml данных, который используется для хранения состояния рабочего процесса. Синтаксический анализ с LinqToXML сэкономит вам много времени, и вы должны быть уверены, что проверили все различия - если осталось только одно отличие, wf не сможет загрузить. Существует один элемент «ResumeData», который вы можете найти в состоянии wf xml, который слишком тяжел для анализа, но хорошая новость заключается в том, что вы можете просто удалить его.

1 голос
/ 27 января 2010

Это не столько проблема Windows Workflow, сколько служба персистентности SQL. Вы можете создать свой собственный сервис персистентности, который может справиться с этой ситуацией, либо поддерживая преобразование старого рабочего процесса в новый рабочий процесс, либо что-то более абстрактное, например, сервис персистентности, который сериализуется как XML / JSON, что может легче поддерживать десериализацию версия как другая версия.

...