超过Axon 4.4上的阈值后,未填充Axon框架快照事件



我目前正在使用Axon4.4/Springboot/Java实现一个cqrs应用程序。我的应用程序运行良好,只是在超过事件计数快照触发阈值(出于测试目的,我已将其设置为3(后,它不会生成快照。我正在使用Mongo-db。我实际上可以在axonframeworkdb中看到快照事件,但快照事件计数仍然为0。请问我缺了什么?谢谢请参阅下面的配置--SnapshotConfig:

@Configuration
public class SnapshotConfig {
@Bean
public SpringAggregateSnapshotterFactoryBean snapshotfactorybean() {
return new SpringAggregateSnapshotterFactoryBean();
}
@Bean
public SpringAggregateSnapshotter snapshotter(ParameterResolverFactory parameterResolverFactory, EventStore eventStore, TransactionManager transactionManager) {
Executor executor = Executors.newFixedThreadPool(5);
return new SpringAggregateSnapshotter.Builder().eventStore(eventStore)
.parameterResolverFactory(parameterResolverFactory)
.executor(executor)
.transactionManager(transactionManager)
.build();
}
@Bean
public AggregateFactory<BuyerAggregate> buyerAggregateFactory() {
SpringPrototypeAggregateFactory<BuyerAggregate> aggregateFactory = new SpringPrototypeAggregateFactory<BuyerAggregate>("buyerAggregate");
aggregateFactory.setBeanName("buyerAggregateFactory");
return aggregateFactory;
}
@Bean("buyerRepository")
public EventSourcingRepository<BuyerAggregate> buyerRepository(Snapshotter snapshotter, EventStore eventStore, ParameterResolverFactory parameterResolverFactory) {
return  EventSourcingRepository.builder(BuyerAggregate.class)
.aggregateFactory(buyerAggregateFactory())
.eventStore(eventStore)
.parameterResolverFactory(parameterResolverFactory)
.snapshotTriggerDefinition(buyerAggregateSnapshotTrigger(snapshotter))
.build();
}
@Bean("buyerAggregateSnapshotTrigger")
public SnapshotTriggerDefinition buyerAggregateSnapshotTrigger(Snapshotter snapshotter) {
return new EventCountSnapshotTriggerDefinition(snapshotter, 3);
}

数据库配置是这样的:

@Bean
public MongoClient mongo() {
var mongoFactory = new MongoFactory();
var mongoSettingsFactory = new MongoSettingsFactory();
mongoSettingsFactory.setMongoAddresses(Collections.singletonList(new ServerAddress(mongoHost, mongoPort)));
mongoFactory.setMongoClientSettings(mongoSettingsFactory.createMongoClientSettings());
return mongoFactory.createMongo();
}
@Bean
public MongoTemplate axonMongoTemplate(){
return DefaultMongoTemplate.builder()
.mongoDatabase(mongo(), mongoDatabase)
.build();
}
@Bean
public TokenStore tokenStore(Serializer serializer) {
return MongoTokenStore.builder()
.mongoTemplate(axonMongoTemplate())
.serializer(serializer)
.build();
}
@Bean
public EventStorageEngine storageEngine(MongoClient mongoClient){
return MongoEventStorageEngine.builder()
.eventSerializer(serializer())
.snapshotSerializer(serializer())
.mongoTemplate(DefaultMongoTemplate.builder().mongoDatabase(mongoClient).build())
.build();
}
@Bean
public ObjectMapper objectMapper(){
var objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
return objectMapper;
}
public Serializer serializer(){
return new JacksonSerializer.Builder()
.objectMapper(objectMapper())
.build();
}

@Bean
public EmbeddedEventStore eventStore(EventStorageEngine storageEngine, AxonConfiguration configuration) {
return EmbeddedEventStore.builder()
.storageEngine(storageEngine)
.messageMonitor(configuration.messageMonitor(EventStore.class, "eventStore"))
.build();
}

我的汇总片段如下:

@Aggregate(snapshotTriggerDefinition = "buyerAggregateSnapshotTrigger", repository = "buyerRepository")
public class BuyerAggregate {
@AggregateIdentifier
private String id;
private Buyer buyer;

在配置方面,您应该能够获得以下内容:

// somewhere in a config package...
@Configuration
public class AxonConfig {
// among other configuration methods...
@Bean
public SnapshotTriggerDefinition buyerAggregateSnapshotTrigger(
Snapshotter snapshotter
) {
return new EventCountSnapshotTriggerDefinition(snapshotter, 3);
}
}
// somwehere in a command package...
@Aggregate(snapshotTriggerDefinition = "buyerAggregateSnapshotTrigger")
public class BuyerAggregate {
// state, command handlers and event sourcing handlers...
}

因此,在您的示例中应该不需要自定义Snapshotter配置。

除此之外,我想知道你为什么要使用Axon 4.4。你试过使用最新版本吗?顺便说一句,目前是4.5.3。

尽管如此,遗憾的是,从所提供的代码中并没有太多可推导的内容。正如Lucas Campos也评论的那样,分享一个小样本项目可能是有益的,它能始终如一地显示你正在经历的错误。我们,其他人,可以在本地运行它来注意到困境。更重要的是,它允许其他人(比如我(进行一些调试。

我还想在您的示例中分享一些关于Mongo事件存储选择的内容。在AxonIQ,有一种趋势是推荐使用Mongo作为存储解决方案。《参考指南》中实际分享了这一点。此外,AxonIQ的CTO Allard Buijze在这段视频中也很好地解释了这一点。

我建议您尝试一下AxonServer,因为它是一个专用的事件存储实现。在走这条路时,您一定要遵守所有事件存储的要求。

最新更新