2009-12-02 2 views
0

Я хочу реализовать решение в своих рабочих процессов, которые будут выполнять следующие функции:Приостановка экземпляра рабочего процесса в Fault Handler

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

Затем в какой-то момент экземпляр получит команду Resume().

Что я хочу реализовать, когда команда Resume() была получена, экземпляр снова выполнит операцию, которая ранее не удалась (и вызвала исключение), а затем продолжает выполнять все, что он должен делать.

Что моя проблема:

  1. Когда приостановлено, а затем возобновлено внутри Fault Handler, экземпляр просто завершается. Конечно, резюме не возвращает экземпляр к выполнению, , так как в обработчике ошибок после операции Suspend у меня ничего нет. Итак, , очевидно, выполнение рабочего процесса заканчивается.

  2. Я НЕ хочу, чтобы реализовать Fault Handler на уровне рабочего процесса, а не использовать While + последовательность действия, чтобы обернуть каждую активность в рабочем процессе (как описано здесь: Error Handling In Workflows), так как с моими довольно тяжелыми рабочими процессами - это позволит выглядят как ад. Это должно быть своего рода общий обращение ..

Есть ли у вас какие-либо идеи ??

Спасибо.

ответ

0

Боюсь, что это не сработает. Обработка ошибок в рабочем процессе похожа на блок Try/Catch, и единственный способ повторить - это обернуть все, это цикл и просто выполнить цикл снова, если что-то не так.

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

+0

Благодарим за ответ. Ну ... Я знаю об этом решении. Да, это то, что описано во многих статьях в Интернете. Но я все еще ищу элегантное решение того типа, который я описал. – Alex

1

Если вы работаете над State Machine Workflows, моя техника для устранения ошибок, требующих вмешательства человека, заключается в создании дополнительного узла «stateactivity», который указывает состояние «ошибки», что-то вроде STATE_FAULTED. Затем в каждом состоянии есть фалюльтилятор, который ловит любое исключение, регистрирует исключение и изменяет состояние на STATE_FAULTED, передавая информацию, такую ​​как текущая активность, тип поднятого исключения и любая другая информация контекста, которая может вам понадобиться.

В инициализации STATE_FAULTED вы можете прослушивать внешнюю команду (вашу команду Resume() или что вам подходит), и когда все в порядке, вы можете просто переключиться на предыдущее состояние и возобновить выполнение.

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