Загрузка сохраненного рабочего процесса после изменения определения рабочего потока в WF4

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

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

Теперь я прекращаю приложение

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

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

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

        wfapp.Load(wfGuid);

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

Каков наилучший способ решить эту проблему?

5 ответов

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам