#masstransit
#masstransit
Вопрос:
Я внедряю конечный автомат САГИ MassTransit с состояниями «Начальный»> «Ожидающий подтверждения»> «Подтвержденный»> «Завершен» . «Ожидающий подтверждения» и «Подтвержденный» могут быть переключены. Но я хотел бы действовать, делая что-то после изменения состояния с «Ожидание подтверждения» на «Подтверждено».
В настоящее время я пытаюсь добавить задачу синхронизации после перехода к «Подтвержденному». Я обнаружил, что состояние не будет переведено в «Подтвержденное» при вызове задачи doSomething и действии. Это работает не так, как ожидалось.
**During(PendingAcknowledged)**,
When(DoAcknowledged)
.ThenAsync(MarkAcknowledged)
.Then(context => Log.Information("{@DoAcknowledge}", context.Instance))
**.TransitionTo(Acknowledged),**
**.ThenAsync(DoSomeThing)**
Есть предложения? Как я могу это сделать?
Комментарии:
1. Если вы этого не видели, на YouTube доступен целый сезон эпизодов о конечных машинах. Вы могли бы улучшить свое понимание там.
Ответ №1:
После получения события MassTransit:
- Загружает существующий или создает новый экземпляр saga
- Выполняет все действия, связанные с текущим состоянием на момент загрузки экземпляра
- Сохраняет экземпляр saga в хранилище saga
Допускается наличие нескольких TransitionTo
действий в конечном автомате, но экземпляр saga будет сохранен с последним состоянием только после завершения всех действий.
Итак, из вашего примера видно, что это полностью законно и сохранит Acknowledged
состояние в репозитории.
During(PendingAcknowledged),
When(DoAcknowledged)
.ThenAsync(MarkAcknowledged)
.Then(context => Log.Information("{@DoAcknowledge}", context.Instance))
.TransitionTo(Acknowledged),
.ThenAsync(DoSomeThing)
Комментарии:
1. Привет, Крис, проблема в том, что я хочу что-то сделать после перехода к «подтвержденному», не завершив все действия, а затем перейдя к «подтвержденному». Итак, ввод команды перехода перед thenasync не поможет, верно? Большое вам спасибо за вашу поддержку.
2. Вы можете выполнять действия после
TransitionTo
инструкции, как я показал выше. Чем ваши ожидания отличаются от того, что я объяснил?3. Признак подтверждения работает, но переход в подтвержденное состояние и dosomething не вызываются. Сейчас это моя проблема.
4. Если у вас есть отдельный пример проблемы (через GitHub), не стесняйтесь поделиться им. Без этого я не верю, что есть какие-либо проблемы с Automatonymous, и каким-то образом ваш ThenAsync блокирует выполнение остальной части поведения.
5. Крис, я снова просмотрел свое кодирование и обнаружил ошибку в своем кодировании. doSomething был вызван для ожидания сейчас. Большое вам спасибо за вашу помощь.