Search code examples
spring-bootsnapshotaxon

axon 4 snapshot in demand


I work with spring boot and axon example, i implement the snapshot feature, with the below code is working fine, after 3 events i found the data in the table snapshot_event_entry in the database

@Configuration
@AutoConfigureAfter(value = { AxonAutoConfiguration.class })
public class AxonConfig {

    @Bean
    public SnapshotTriggerDefinition catalogSnapshotTrigger(Snapshotter snapshotter) {
        return new EventCountSnapshotTriggerDefinition(snapshotter, 3);
    }
}


@Aggregate(snapshotTriggerDefinition = "catalogSnapshotTrigger")
public class CatalogAggregate { }

My question, is there a method to do a snapshot in demand? That means i want to implement an api to do the snapshot, not automatically after 3 events


Solution

  • there is nothing already in place. One way to implement what you need is to create a dedicated Command, eg PerformShapshotCmd, that will carry the aggregateId information, and a @CommandHandler into your Aggregate. You could then let Spring autowire the Snapshotter instance bean, and call for the scheduleSnapshot(Class<?> aggregateType, String aggregateIdentifier) method.

    Below some code snippet that could guide you.

    data class PerformShapshotCmd(@TargetAggregateIdentifier val id: String)
    
        @CommandHandler
        public void handle(PerformShapshotCmd cmd, Snapshotter snapshotter) {
            logger.debug("handling {}", cmd);
    
            snapshotter.scheduleSnapshot(this.getClass(), cmd.getId());
        }
    

    You should also define one Bean of type Snapshotter into your config

    @Bean
    public SpringAggregateSnapshotterFactoryBean snapshotter() {
        SpringAggregateSnapshotterFactoryBean springAggregateSnapshotterFactoryBean = new SpringAggregateSnapshotterFactoryBean();
        //Setting async executors
        springAggregateSnapshotterFactoryBean.setExecutor(Executors.newSingleThreadExecutor());
        return springAggregateSnapshotterFactoryBean;
    }
    

    Please note that the first argument of your commandHandler needs to be the command, otherwise the framework will complain with an exception at startup time.