3

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

Я бы хотел, чтобы они (пользовательские действия) сохранялись, не имея рабочего процесса в незанятом состоянии. Она должна быть такой системы отказоустойчивой, так что всякий раз, когда что-то пойдет не так во время выполнения рабочего процесса может быть:

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

Я я работал в течение нескольких дней с упорством рабочего процесса, но я не уверен, смогу ли я достичь своей цели. Зачем?

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

Можете ли вы, пожалуйста, посоветовать мне, это заводы рабочего процесса - это путь сюда?

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

Edit:

В WF3 был атрибут PersistOnClose который был бы достаточно для моего требования. в wf4 он был заменен на Persist активность, которая также может быть полезна, однако я не хочу иметь дополнительные действия в моих уже сложных рабочих процессах.

В идеале было бы здорово, чтобы быть в состоянии выполнить context.RequestPersist(callback) из NativeActivityContext, однако этот метод является внутренним (и все, что находится внутри него не видно снаружи оригинальной сборки.

ответ

3

Вот что я пришел с:

  • неблокируемой закладка не вариант. Хотя неблокирующая закладка не препятствует завершению деятельности по созданию, но также не приводит к тому, что экземпляр рабочего процесса становится бездействующим, что означает, что он не будет сохранен. Неблокирующие закладки отбрасываются после завершения операции (которая ее создала). Эта закладка может быть возобновлена ​​только в том случае, если создание активности еще не завершено.
  • Использование PersistOnCloseAttribute не является вариантом, потому что я использую WF4, и этот атрибут - только .NET 3.x WF.
  • Блокировка закладок не может быть использована, поскольку они блокируют выполнение рабочего процесса, что нежелательно.

Решение заключается в использовании Persist активности в каждом выполненный на заказ деятельности (должен простираться NativeActivity, который может планировать ребенка деятельность):

//class field 
Activity childActivity = new Persist(); 

Для того, чтобы заставить его работать, он должен быть добавлен метаданные, как ImplmentationChild:

protected override void CacheMetadata(NativeActivityMetadata metadata) 
{ 
    base.CacheMetadata(metadata); 
    metadata.AddImplementationChild(this.childActivity); 
} 

последняя вещь, чтобы запланировать ребенок деятельность от Execute метода (не имеет значения, где, настойчивость будет происходить только после вызова деятельности завершено *).

protected override void Execute(NativeActivityContext context) 
{ 
    //... 
    context.ScheduleActivity((Activity)this.childActivity); 
} 

Чтобы сохранить рабочий процесс сохраняется после необработанного исключения, этот кусок кода должны быть добавлены к WorkflowApplication:

application.OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e) 
{ 
     return UnhandledExceptionAction.Abort; 
}; 

* возврат из метода Execute не обязательно означает, что активность «завершено» - т. е. блокируются закладки в действии (см. ниже недостатки).

Есть несколько недостатков этого решения:

  • решение сохраняет только один состояние процесса (последнее состояние).
  • Настойчивость может произойти только при завершении работы. Это означает, что persist/resume не может быть выполнено с середины действия.
  • Он не работает с параллельными циклами/последовательностями - действия из параллельного цикла/последовательности сохраняются после завершения всей параллельной работы. Он корректно работает с регулярными циклами/последовательностями.
  • Блокировка закладок оказывает огромное влияние на это решение (если они созданы при создании активности или в других дочерних действиях создания активности). Они приводят к тому, что эта активность не завершена, хотя метод Execute возвращается. В конце концов Persist будет выполняться (либо после завершения операции, либо до перехода в состояние ожидания).
0

Если я понимаю, что вы вопрос правильно, то , у вас есть ниже требований.

  1. Стойкости и восстановление процесса.
  2. Пользователь может приостанавливать и возобновлять.
  3. В случае каких-либо исключений, workflo w сохраняется и возобновляется со следующего мероприятия.

Вы можете использовать нижеследующие шаги.

  1. Вы можете использовать службу WF + WCF для выполнения и размещения рабочего процесса.
  2. Добавить постоянство и отслеживание с помощью базы данных, такой как Sql-сервер, если вы используете oracle, то можете использовать Devart.
  3. Настройте ControlEnpont для приостановки и возобновления.
  4. Использовать try/Catch и persistence, чтобы разумно обрабатывать исключение.

в случае каких-либо проблем и необходимости настройки обсуждается так же. :) Поскольку я разработал рабочий процесс, похожий на ваш.

Смежные вопросы