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