I am currently implementing a cqrs application using Axon4.4/Springboot/Java. My application works well except for the fact that it isn't generating the snapshots after exceeding the event count snapshot trigger threshold (which for testing purposes I have set to 3). I am using Mongo db. I can actually see the snapshotevents in the axonframework db, but the snapshot event count is still 0. Please what am i missing? Thanks Please see below my config -- 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);
}
The db config is something like this:
@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();
}
And my aggregate snippet is as follows:
@Aggregate(snapshotTriggerDefinition = "buyerAggregateSnapshotTrigger", repository = "buyerRepository")
public class BuyerAggregate {
@AggregateIdentifier
private String id;
private Buyer buyer;