Аксон создает агрегат внутри саги - PullRequest
0 голосов
/ 05 марта 2019

Я не уверен, как правильно задать этот вопрос, но вот он:

Я запускаю сагу на конкретное событие, затем отправляю команду, которая должна создать агрегат, а затем отправляюдругое событие, которое будет обработано сагой для продолжения логики.

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

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Решение, которое вы разместили, определенно подойдет. Позвольте мне объяснить сценарий, который вы здесь применили, но и для других людей.

В приложении Axon Framework 4.x любой компонент обработки событий, а значит и ваши экземпляры Saga, поддерживаются TrackingEventProcessor. Процессор отслеживания событий «отслеживает», в какой точке потока событий он обрабатывает события. Он сохраняет эту информацию через TrackingToken, для которого TokenStore является делегирующей частью работы.

Однако, если вы не указали TokenStore, у вас будет в памяти TrackingTokens для каждого обработчика событий отслеживания. Это означает, что при перезапуске ваш процессор отслеживания событий думает: «О, я еще не занимался обработкой событий, позвольте мне начать с начала времени». В связи с этим ваши экземпляры Saga каждый раз будут запускать новые, пытаясь воссоздать данный экземпляр Aggregate.

Впредь, указав TokenStore, как вы решили проблему, с которой столкнулись.

Обратите внимание, что в среде Spring Boor, например, при наличии стартера Spring Data, Axon автоматически создаст для вас JpaTokenStore.

0 голосов
/ 06 марта 2019

Я решил свою проблему, просто добавив конфигурацию хранилища токенов, она делает именно то, что мне нужно - отслеживать обработанные события.

Базовая конфигурация пружины:

    @Bean
    fun tokenStore(client: MongoClient): TokenStore = MongoTokenStore.builder()
        .mongoTemplate(DefaultMongoTemplate.builder().mongoDatabase(client).build())
        .serializer(JacksonSerializer.builder().build())
        .build()
...