Состояние саги MassTransit: хотел бы выполнить действие после перемещения состояния

#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:

  1. Загружает существующий или создает новый экземпляр saga
  2. Выполняет все действия, связанные с текущим состоянием на момент загрузки экземпляра
  3. Сохраняет экземпляр 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 был вызван для ожидания сейчас. Большое вам спасибо за вашу помощь.