#domain-driven-design #axon
#дизайн, управляемый доменом #аксон
Вопрос:
Я не уверен, как правильно задать этот вопрос, но вот он:
Я запускаю saga для определенного события, затем отправляю команду, которая должна создать некоторый агрегат, а затем отправить другое событие, которое будет обработано saga для продолжения логики.
Однако каждый раз, когда я перезапускаю приложение, я получаю сообщение об ошибке, в котором говорится, что событие для aggregate в последовательности x уже было вставлено, что, я полагаю, связано с тем, что saga еще не завершена, и когда я перезапускаю ее, она запускает ее снова, пытаясь создать новый aggregate.
Вопрос в том, есть ли в axoniq какой-либо способ отслеживать прогресс саги? Например, должен ли я установить некоторые флаги при получении события и обернуть в ifs совокупное создание? Может быть, есть другой способ, которого я не вижу, я просто не хочу, чтобы сага воспроизводилась с самого начала.
Спасибо
Комментарии:
1. Крошечная мелочь, но я бы переименовал заголовок вашего вопроса в «Axon — creating Aggregate внутри Saga». AxonIQ — это название компании, но не продукта. 😉
Ответ №1:
Решение, которое вы опубликовали, определенно сработало бы. Позвольте мне объяснить сценарий, который вы затронули здесь, хотя и для ссылок других людей тоже.
В приложении Axon Framework 4.x любой компонент обработки событий, а следовательно, и ваши экземпляры Saga, поддерживаются TrackingEventProcessor
. Процессор отслеживания событий «отслеживает», в какой точке потока событий он обрабатывает события. Он хранит эту информацию через a TrackingToken
, для которого TokenStore
часть работы делегируется.
Если вы не указали TokenStore
однако, у вас будет в памяти TrackingTokens
для каждого процессора отслеживания событий. Это означает, что при перезапуске ваш процессор отслеживания событий думает: «Ой, я еще не выполнял никакой обработки событий, позвольте мне начать с начала времен». Из-за этого ваши экземпляры Saga будут каждый раз запускать новые, пытаясь воссоздать данный экземпляр Aggregate.
С этого момента указание TokenStore
, как вы это сделали, решило возникшую у вас проблему.
Обратите внимание, что в среде Spring Boor, например, при наличии Spring Data starter, Axon автоматически создаст JpaTokenStore
для вас.
Ответ №2:
Я решил свою проблему, просто добавив конфигурацию хранилища токенов, она делает именно то, что мне требуется — отслеживает обработанные события.
Базовая конфигурация spring:
@Bean
fun tokenStore(client: MongoClient): TokenStore = MongoTokenStore.builder()
.mongoTemplate(DefaultMongoTemplate.builder().mongoDatabase(client).build())
.serializer(JacksonSerializer.builder().build())
.build()