Delete event snapshot

Hi!

When an aggregate is deleted I use Axon’s markDeleted() method to prevent further handling of further commands on the aggregate. I was wondering what would happen if the delete event triggers the snapshotting mechanism. So I set the snapshot trigger event count to ‘1’ and ran some integration tests. It seems as if I no longer get an ‘AggregateDeletedException’. I’m wondering if there is something wrong with my configuration, or if I need a custom snapshot trigger definition that prevents snapshots when an aggregate is removed.

`

@Autowired
public void configure(EventHandlingConfiguration config, Environment env) {
if (!Arrays.asList(env.getActiveProfiles()).contains(“test”)
&& !Arrays.asList(env.getActiveProfiles()).contains(“localtest”)) {
config.usingTrackingProcessors(); // default all processors to tracking mode.
}
}

@Bean
public EventUpcasterChain upcasterChain() {
// Add Upcaster constructor calls here
return new EventUpcasterChain(
);
}

@Bean
public PersistenceExceptionResolver persistenceExceptionResolver() {
return new JdbcSQLErrorCodesResolver();
}

@Bean
public UnitOfWorkAwareConnectionProviderWrapper springDataSourceConnectionProvider(DataSource dataSource) {
return new UnitOfWorkAwareConnectionProviderWrapper(new SpringDataSourceConnectionProvider(dataSource));
}

@Bean
public JdbcEventStorageEngine jdbcEventStorageEngine(Serializer serializer,
EventUpcasterChain upcasterChain,
PersistenceExceptionResolver persistenceExceptionResolver,
ConnectionProvider connectionProvider,
TransactionManager transactionManager) {
return new JdbcEventStorageEngine(serializer, upcasterChain, persistenceExceptionResolver,
connectionProvider, transactionManager);
}

@Bean
public SpringTransactionManager axonSpringTransactionManager(DataSourceTransactionManager platformTransactionManager) {
return new SpringTransactionManager(platformTransactionManager);
}

@Bean
public JdbcTokenStore jdbcTokenStore(ConnectionProvider springDataSourceConnectionProvider, Serializer serializer) {
return new JdbcTokenStore(springDataSourceConnectionProvider, serializer);
}

@Bean
public SpringAggregateSnapshotterFactoryBean springAggregateSnapshotterFactoryBean() {
return new SpringAggregateSnapshotterFactoryBean();
}

@Bean
public SagaStore sagaRepository(ConnectionProvider springDataSourceConnectionProvider, Serializer serializer) {
// Use the Generic Schema, since it stores the Saga data in a single column instead of using n key/value rows per Saga.
JdbcSagaStore jdbcStore = new JdbcSagaStore(springDataSourceConnectionProvider, new GenericSagaSqlSchema(), serializer);
return new CachingSagaStore<>(jdbcStore, new WeakReferenceCache(), new WeakReferenceCache());
}

private Repository getRepository(Class clazz, EventStore eventStore, Snapshotter snapshotter,
ParameterResolverFactory parameterResolverFactory) {
SnapshotTriggerDefinition snapshotTrigger = new EventCountSnapshotTriggerDefinition(snapshotter, 1);
GenericAggregateFactory aggregateFactory = new GenericAggregateFactory<>(clazz);
return new EventSourcingRepository<>(aggregateFactory, eventStore, parameterResolverFactory, snapshotTrigger);
}

@Bean
public Repository calendarRepository(EventStore eventStore, Snapshotter snapshotter,
ParameterResolverFactory parameterResolverFactory) {
return getRepository(Calendar.class, eventStore, snapshotter, parameterResolverFactory);
}

`

Thanks a lot!

Andreas

Hi Andreas,

it looks like you’ve hit an “undocumented feature”. The AggregateSnapshotter fails to check whether an aggregate is marked deleted.
Do you want to file an issue for it (and get the credit for it :wink: ), or do you prefer me to do it myself?

Cheers,

Allard

Ah ok, thanks for the answer! I’ll file an issue :slight_smile:

Cheers,
Andreas