Есть ли способ воспроизвести события в диапазоне дат? - PullRequest
1 голос
/ 10 мая 2019

Я реализую пример пружинной загрузки и аксона. У меня два события (пополнить и снять остаток на счете). Я хочу знать, есть ли какой-нибудь способ узнать состояние Агрегата аккаунта к определенной дате? Я хочу получить не только конечное состояние, но и воспроизвести события в диапазоне дат.

1 Ответ

1 голос
/ 10 мая 2019

Я думаю, что могу помочь с этим.

В контексте Axon Framework вы можете начать воспроизведение событий, сказав данному TrackingEventProcessor «сбросить» его токены. Кстати, текущее описание этого в Справочном руководстве можно найти здесь .

Это TrackingTokens объекты, которые знают, как далеко данный TrackingEventProcessor находится в терминах обработки событий из потока событий. Таким образом, сброс / настройка этих TrackingTokens - это то, что вызовет повторное воспроизведение событий.

Зная все это, второй шаг состоит в том, чтобы взглянуть на методы, которые TrackingEventProcessor предоставляет для «сброса токенов», который является тройным:

  1. TrackingEventProcessor#resetTokens()
  2. TrackingEventProcessor#resetTokens(Function<StreamableMessageSource, TrackingToken>)
  3. TrackingEventProcessor#resetTokens(TrackingToken)

Опция 1 сбрасывает ваши токены в начало потока событий, который, таким образом, воспроизводит все. Варианты два и три, однако, дают вам возможность предоставить TrackingToken.

Таким образом, вы можете указать TrackingToken, начиная с нескольких точек в потоке событий. Итак, как вы собираетесь создать такой TrackingToken в определенный момент времени? Для этого вам следует взглянуть на интерфейс StreamableMessageSource, который выполняет следующие операции:

  1. StreamableMessageSource#createTailToken()
  2. StreamableMessageSource#createHeadToken()
  3. StreamableMessageSource#createTokenAt(Instant)
  4. StreamableMessageSource#createTokenSince(Duration)

Вариант 1 - это то, что используется для создания токена в начале потока, в то время как 2 создает токен в начале потока.

Варианты 3 и 4, однако, позволят вам создать токен в определенный момент времени, что позволит вам воспроизвести все события, начиная с определенного экземпляра до настоящего времени.

Однако в этом сценарии есть одна оговорка. Вы просите воспроизвести Агрегат. С точки зрения Аксона по умолчанию, Агрегат - это Модель команд в настройке CQRS, которая имеет дело с командами, входящими в вашу систему. В большинстве приложений вы хотите, чтобы команды (например, запросы на изменение чего-либо) появлялись в текущем состоянии приложения. Таким образом, Repository, предоставленный для получения Агрегата, не позволяет указывать момент времени.

Описанное выше решение в отношении воспроизведения, таким образом, связано исключительно с созданием модели запроса, поскольку TrackingEventProcessor является частью стороны обработки событий в вашем приложении, наиболее часто используемой для создания представлений. Эта идея также связана с вашими вопросами, что вы хотите знать «состояние Агрегата учетной записи» в данный момент времени. Это не команда , а запрос , так как у вас есть «запрос данных» вместо «запроса на изменение состояния».

Надеюсь, это поможет вам @Safe!

...