Я реализую пример пружинного ботинка и аксона. У меня есть два события (пополнение и снятие остатка на счете). Я хочу знать, есть ли способ узнать состояние агрегата учетной записи на заданную дату? Я хочу получить не только окончательное состояние, но и воспроизвести события в диапазоне дат.
Есть ли способ воспроизвести события в диапазоне дат?
Ответы (1)
Думаю, я могу помочь с этим.
В контексте Axon Framework вы можете начать воспроизведение событий, сказав данному TrackingEventProcessor
«сбросить» его токены. Кстати, текущее описание этого в Справочном руководстве можно найти здесь.
Эти TrackingTokens
- объекты, которые знают, насколько далеко данный TrackingEventProcessor
с точки зрения обработки событий из потока событий. Таким образом, сброс / настройка этих TrackingTokens
- это то, что вызовет воспроизведение событий.
Зная все это, второй шаг - взглянуть на методы, которые TrackingEventProcessor
предоставляет для «сброса токенов», которые делятся на три части:
TrackingEventProcessor#resetTokens()
TrackingEventProcessor#resetTokens(Function<StreamableMessageSource, TrackingToken>)
TrackingEventProcessor#resetTokens(TrackingToken)
Первый вариант сбросит ваши токены в начало потока событий, который, таким образом, воспроизведет все. Однако варианты два и три дают вам возможность предоставить TrackingToken
.
Таким образом, вы можете указать TrackingToken
, начиная с нескольких точек в потоке событий. Итак, как вы подойдете к созданию такого TrackingToken
в определенный момент времени? Для этого вам следует взглянуть на интерфейс StreamableMessageSource
, который выполняет следующие операции:
StreamableMessageSource#createTailToken()
StreamableMessageSource#createHeadToken()
StreamableMessageSource#createTokenAt(Instant)
StreamableMessageSource#createTokenSince(Duration)
Вариант 1 - это то, что используется для создания токена в начале потока, а вариант 2 создает токен в начале потока.
Однако варианты 3 и 4 позволят вам создать токен в определенный момент времени, что позволит вам воспроизвести все события с момента определенного экземпляра до настоящего времени.
Однако в этом сценарии есть одна оговорка. Вы просите переиграть агрегат. С точки зрения Axon по умолчанию Aggregate - это модель команд в CQRS, настроенная, таким образом, имея дело с командами, поступающими в вашу систему. В большинстве приложений вы хотите, чтобы команды (например, запросы на изменение чего-либо) выполнялись в текущем состоянии приложения. Таким образом, Repository
, предоставленный для получения Агрегата, не позволяет указать момент времени.
Таким образом, описанное выше решение в отношении воспроизведения связано исключительно с созданием модели запроса, поскольку TrackingEventProcessor
является частью стороны обработки событий в вашем приложении, наиболее часто используемой для создания представлений. Эта идея также связана с вашими вопросами о том, что вы хотите знать «состояние агрегированной учетной записи» в данный момент времени. Это не команда, а запрос, поскольку у вас есть «запрос данных» вместо «запрос на изменение состояния».
Надеюсь, это поможет вам @Safe!