Как запустить выполнение потока компенсации для действий, используемых в конечном автомате Automatonymous?

Мои действия время от времени генерируют исключения во время выполнения, поэтому я реализовал методы с ошибкой Activity<TInstance>, чтобы справиться с этим, отбросив изменения, внесенные в метод Execute. Я подумал, что в Automatonymous есть какая-то проводка, которая делает так, что метод Faaled выполняется, когда метод Execute генерирует исключение, а затем вызывает методы Faailed для действий, которые уже были выполнены. Оказывается, такого нет, так как мои методы с ошибкой никогда не выполняются.

Должен ли я вместо этого вызывать их сам в блоке try / catch? Я мог бы создать BehaviorExceptionContextProxy на основе BehaviorContext и сгенерированного исключения. Единственным следующим Behavior, который я мог бы передать, будет тот, который вставлен в этот Activity метод Execute, но логически это означает, что я компенсирую в неправильном направлении, поскольку следующий Behavior фактически должен быть выполнен после того, как этот будет успешным, поэтому я бы тоже компенсировал много.

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

Есть ли хороший способ запустить компенсационный поток деятельности?


person Slowacki    schedule 22.11.2018    source источник
comment
Автоматы состояний используются для саг, а действия - для Courier. Вам необходимо использовать Курьера для выполнения ваших действий и заставить работать резервные копии.   -  person Alexey Zimarev    schedule 22.11.2018
comment
Хм, это кажется немного неинтуитивным, если при моделировании конечного автомата использование Activity разрешено "из коробки", а метод Faaled должен быть реализован для каждого из них. В любом случае спасибо за информацию. Думаю, перепишу компенсацию с помощью методов Catch в самом конечном автомате.   -  person Slowacki    schedule 22.11.2018
comment
Я не уверен, может быть, я что-то упускаю, но я никогда не видел, чтобы в автоматах конечных автоматов использовались действия.   -  person Alexey Zimarev    schedule 22.11.2018
comment
Вы можете добавить действия в свой конечный автомат с помощью метода расширения Activity, если хотите использовать фабрику: github.com/MassTransit/MassTransit/blob/develop/src/ Или просто через .Execute, если вы хотите создать их на месте: github.com/MassTransit/Automatonymous/blob/develop/src/   -  person Slowacki    schedule 22.11.2018


Ответы (1)


Действия в конечном автомате (с использованием Automatonymous) сильно отличаются от действий в Courier. К сожалению, у них обоих одно и то же имя, что может вызвать путаницу.

Когда действие вызывает исключение, вызывается метод Faulted следующего действия в поведении. Если этот метод является обычным методом действия (например, .Then, .Publish и т. Д.), Он пропускается, поскольку метод Faulted этих действий просто вызывает следующее действие в поведении.

Однако действие Catch можно использовать для перехвата исключения и выполнения действия по спасению (которое представляет собой последовательность действий).

В любом случае, метод Faaled для действия, которое вызывает исключение в методе Execute, не вызывается. Итак, да, вы должны использовать try / catch, но разрешить исключению течь обратно из метода Execute, чтобы поведение обрабатывало его должным образом.

person Chris Patterson    schedule 24.11.2018
comment
Да, я этого и ожидал, немного запутался после разговора с Алексеем. Спасибо за ответ. Это объясняет, почему мои действия не были выполнены. В конце концов, в состояниях, в которых выполняются действия, я добавил Catch и опубликовал событие с деталями исключения, которые будут обрабатываться другим действием, созданным только для смягчения исключения. - person Slowacki; 29.11.2018