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

Я использую конечный автомат MassTransit SAGA с состояниями Начальное ›Ожидает Подтверждено› Подтверждено ›Завершено. Pending Acknowledged и Acknowledged могут быть переключены. Но я хотел бы что-то сделать после изменения состояния с «Ожидает подтверждения» на «Подтверждено».

В настоящее время я пытаюсь добавить задачу thenAsync после перехода на Acknowledged. Я обнаружил, что состояние не будет перемещено в Подтверждено при вызове задачи DoSomeThing и действии. Он работает не так, как ожидалось.

 **During(PendingAcknowledged)**,
 When(DoAcknowledged)
   .ThenAsync(MarkAcknowledged)
   .Then(context => Log.Information("{@DoAcknowledge}", context.Instance))
   **.TransitionTo(Acknowledged),**
   **.ThenAsync(DoSomeThing)**

Любое предложение ? Как я могу это сделать ?


person Goe_PK    schedule 18.12.2020    source источник
comment
Если вы его не видели, на YouTube. Вы могли бы улучшить свое понимание там.   -  person Chris Patterson    schedule 20.12.2020


Ответы (1)


При получении события MassTransit:

  1. Загружает существующий или создает новый экземпляр саги
  2. Выполняет все действия, связанные с текущим состоянием на момент загрузки экземпляра
  3. Сохраняет экземпляр саги в репозиторий саги

Допускается наличие нескольких TransitionTo действий в конечном автомате, но экземпляр саги будет сохранен только с последним состоянием после завершения всех действий.

Итак, из вашего примера, это полностью законно и сохранит состояние Acknowledged в репозиторий.

During(PendingAcknowledged),
    When(DoAcknowledged)
        .ThenAsync(MarkAcknowledged)
        .Then(context => Log.Information("{@DoAcknowledge}", context.Instance))
        .TransitionTo(Acknowledged),
        .ThenAsync(DoSomeThing)
person Chris Patterson    schedule 18.12.2020
comment
Привет, Крис, проблема в том, что я хочу что-то сделать после перехода к подтверждению, не завершить все действия, а затем перейти к подтверждению. Так что размещение команды перехода перед async не поможет, верно? Спасибо вам большое за вашу поддержку. - person Goe_PK; 20.12.2020
comment
Вы можете делать что-то после оператора TransitionTo, как я показал выше. Чем ваше ожидание отличается от того, что я объяснил? - person Chris Patterson; 20.12.2020
comment
MarkAcknowledged работает, но переход в состояние подтверждения и что-то не вызываются. Теперь это моя проблема. - person Goe_PK; 20.12.2020
comment
Если у вас есть отдельный пример проблемы (через GitHub), не стесняйтесь поделиться им. Без этого я не верю, что есть какие-либо проблемы с Automatonymous, и каким-то образом ваш ThenAsync блокирует выполнение остальной части поведения. - person Chris Patterson; 20.12.2020
comment
Крис, я еще раз просмотрел свое кодирование и обнаружил в нем ошибку. DoSomething теперь вызывается ожидаемо. Большое спасибо за Вашу помощь. - person Goe_PK; 21.12.2020
comment
Крис, есть ли способ перевести состояние в указанное в задаче ThenAync () (без использования синтаксисаTransitionTo в Во время / когда). Пример: я хотел бы иметь логику перехода в состояние или нет в DoSomeTask и не использовать TransitionTo (подтверждено). - person Goe_PK; 24.12.2020
comment
Это не рекомендуется, существуют выражения .If (), .IfElse (), которые можно использовать, если у вас есть условная логика для переходов. - person Chris Patterson; 24.12.2020