Приостановка экземпляра рабочего процесса в обработчике ошибок - PullRequest
0 голосов
/ 02 декабря 2009

Я хочу реализовать решение в своих рабочих процессах, которое будет выполнять следующие действия:

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

Тогда когда-нибудь экземпляр получит команду Resume ().

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

В чем моя проблема:

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

  2. Я действительно хочу реализовать обработчик ошибок на уровне рабочего процесса, а не использовать операцию While + Sequence для переноса каждого действия в рабочем процессе (как описано здесь: Обработка ошибок в рабочих процессах ), так как с моими довольно тяжелыми рабочими процессами - это будет выглядеть как ад. Это должно быть своего рода общая обработка ..

У вас есть идеи ??

Спасибо.

Ответы [ 2 ]

1 голос
/ 03 декабря 2009

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

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

0 голосов
/ 02 декабря 2009

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

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

...