Как воспроизвести события из базы данных перед запуском приложения? - PullRequest
0 голосов
/ 05 февраля 2019

Я студент, который является новичком в структуре Axon для событийного поиска, поэтому терпите меня, пожалуйста.В настоящее время у меня возникают проблемы, когда моему QueryHandler требуется доступ к событиям, которые были созданы до запуска весеннего приложения, они не будут включать их.

Так, например, создается следующее событие:

  • Создан интернет-магазин

(Событие создает новый интернет-магазин и устанавливает для него баланс 100).Это событие сохраняется в моей базе данных.Когда я запрашиваю текущий баланс в интернет-магазине, я могу вернуть, что текущий баланс равен 100. (Код для события и запроса показан ниже)

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

В настоящее время я использую конфигурацию по умолчанию, Axon 4.0.3 для Spring и базу данных H2, которая хранит события в файле локально (H2, я знаю, не лучший выбор, но это все для небольшого доказательстваконцепции, показывающей Event Sourcing и CQRS в действии, поэтому нет необходимости в большом и масштабируемом).

@Service
@NoArgsConstructor
public class WebshopsEventHandler {

    private final Map<String, Webshop> webshops = new HashMap<>();

    // ... some other unrelated code

    @EventSourcingHandler
    public void on(ShopCreatedEvent shopCreatedEvent) {
        this.webshops.put(
                shopCreatedEvent.getId(),
                new Webshop(
                        shopCreatedEvent.getId(),
                        shopCreatedEvent.getName(),
                        shopCreatedEvent.getBalance() // Balance is 100 as default
                )
        );
    }

    // ... some more unrelated code

    @QueryHandler
    protected Optional handle(GetCurrentBalanceQuery getCurrentBalanceQuery) {
        System.out.println("Balance query");
        if (webshops.containsKey(getCurrentBalanceQuery.getShopId())) {
            return Optional.of(webshops.get(getCurrentBalanceQuery.getShopId()).getBalance());
        } else {
            return Optional.empty();
        }
    }
}

Как настроить Axon 4 для получения всех предыдущих событий после перезапуска?

1 Ответ

0 голосов
/ 06 февраля 2019

Я думаю, что могу помочь вам в этом сценарии.Позвольте мне сначала дать вам небольшую предысторию о том, почему ваше «хранилище модели запросов», private final Map<String, Webshop>, не заполняется при каждом запуске.

Технический механизм, который предоставляет события для вашего @EventHandler аннотированногофункции, называется обработчик событий .Начиная с версии 4.0 Axon Framework по умолчанию имеет значение TrackingEventProcessor.

TrackingEventProcessor, как следует из названия, отслеживает собственную обработку событий.Это достигается сохранением TrackingToken - в ваших настройках это означает, что оно будет сохранено в файле базы данных H2.В этом TrackingToken хранится (среди прочего) последнее событие, обработанное данным * 1013. *

TrackingToken - это то, что позволяет вам воспроизводить события, так как вы можете указать его на другой момент временив потоке событий.Регулировка положения токена, таким образом, является ключевой в этом сценарии.

Вы можете сделать это, запустив воспроизведение на TrackingEventProcessor, что более подробно объясняется здесь .Однако, поскольку вы просто показываете, как это работает, а не создаете постоянную систему, я бы предложил что-то более прагматичное.

Если вы установите TokenStore (компонент, отвечающий за хранение ваших токенов) на InMemoryTokenStore, вы будете застрахованы, ваше приложение не будет отслеживать ход обработки событий отслеживания между отключениямиваше приложение.Для этого вы можете сделать следующее в файле конфигурации или в аннотированном классе @SpringBootApplication (при условии, что вы используете Spring Boot):

@Autowired
public void configureInMemoryTokenStore(EventProcessingConfigurer configurer) {
    configurer.registerTokenStore(configuration -> new InMemoryTokenStore());
}

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

...