Повторная обработка определенного сообщения masstransit в новой саге и завершение текущей - PullRequest
0 голосов
/ 09 июля 2019

Я использую Masstransit 5.1.4 с сагами. У меня есть сага, где я хочу реализовать следующее поведение:

  • При получении StartMsg -> переход в активное состояние
  • В активном состоянии обрабатывается несколько событий
  • Если StartMsg получен в этом состоянии, текущая сага завершается и повторно обрабатывает StartMsg в новом экземпляре саги

Как мне этого добиться?

Вот небольшой псевдокод

Initially(
    When(StartEvt)
        .Then(...)
        .TransitionTo(Active)
    );
During(Active,
    When(OneEvt)
        .Then(...),
    When(AnotherEvt
        .Then(...),
    When(EndEvt)
        .Finalize(),
    When(StartEvt)
        // Finalize current saga
        // Transition to initial state reprocessing StartMessage bound to StartEvt

1 Ответ

0 голосов
/ 09 июля 2019

Вам нужно будет завершить текущую сагу и опубликовать событие (или отправить его в ту же очередь, используя Send), которое создаст новый экземпляр саги.В этом случае вам также понадобится использовать репозиторий саги, который будет правильно блокировать корреляционный идентификатор, чтобы вы не обрабатывали два сообщения одновременно для одной и той же корреляции, которая, скорее всего, найдет существующий экземпляр до того, как он будетудален.

Вы НЕ МОЖЕТЕ сделать это в одном обработчике сообщений, хотя, подумав об этом, зачем вам нужно завершать работу, а не возвращать текущий экземпляр саги обратно в исходное состояние?

Кроме того, вы можете рассмотреть возможность использования отдельного идентификатора корреляции для последующего startMsg, чтобы вы могли отслеживать каждую «попытку» завершения.В противном случае вы не будете знать, будут ли запоздалые сообщения из предыдущей попытки сбивать с толку фактическое состояние текущей попытки - поскольку у вас не будет возможности их различить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...