java.lang.Object
dk.cloudcreate.essentials.components.eventsourced.aggregates.snapshot.DelayedAddAndDeleteAggregateSnapshotDelegate
All Implemented Interfaces:
AggregateSnapshotRepository

public class DelayedAddAndDeleteAggregateSnapshotDelegate extends Object implements AggregateSnapshotRepository
Delegating AggregateSnapshotRepository which directly delegates all operations to the provided delegateRepository, except for AggregateSnapshotRepository.aggregateUpdated(Object, AggregateEventStream), AggregateSnapshotRepository.deleteSnapshots(AggregateType, Object, Class, List), which are performed asynchronously in the background.
This ensures that expensive update/clean-up for aggregate snapshots in the database don't affect aggregate persistence performance.
  • Constructor Details

    • DelayedAddAndDeleteAggregateSnapshotDelegate

      public DelayedAddAndDeleteAggregateSnapshotDelegate(AggregateSnapshotRepository delegateRepository)
  • Method Details

    • delegateTo

      public static AggregateSnapshotRepository delegateTo(AggregateSnapshotRepository delegateRepository)
    • loadSnapshot

      public <ID, AGGREGATE_IMPL_TYPE> Optional<AggregateSnapshot<ID,AGGREGATE_IMPL_TYPE>> loadSnapshot(AggregateType aggregateType, ID aggregateId, Class<AGGREGATE_IMPL_TYPE> aggregateImplType)
      Specified by:
      loadSnapshot in interface AggregateSnapshotRepository
      Type Parameters:
      ID - the aggregate ID type
      AGGREGATE_IMPL_TYPE - the concrete aggregate implementation type
      Parameters:
      aggregateType - the aggregate type (determining the aggregate's event stream name)
      aggregateId - the identifier for the aggregate instance
      aggregateImplType - the concrete aggregate implementation type
      Returns:
      the aggregate snapshot wrapped in an Optional if a snapshot was found, otherwise Optional.empty()
    • loadSnapshot

      public <ID, AGGREGATE_IMPL_TYPE> Optional<AggregateSnapshot<ID,AGGREGATE_IMPL_TYPE>> loadSnapshot(AggregateType aggregateType, ID aggregateId, EventOrder withLastIncludedEventOrderLessThanOrEqualTo, Class<AGGREGATE_IMPL_TYPE> aggregateImplType)
      Specified by:
      loadSnapshot in interface AggregateSnapshotRepository
      Type Parameters:
      ID - the aggregate ID type
      AGGREGATE_IMPL_TYPE - the concrete aggregate implementation type
      Parameters:
      aggregateType - the aggregate type (determining the aggregate's event stream name)
      aggregateId - the identifier for the aggregate instance
      withLastIncludedEventOrderLessThanOrEqualTo - the snapshot returned must have AggregateSnapshot.eventOrderOfLastIncludedEvent that is less than or equal to this value
      aggregateImplType - the concrete aggregate implementation type
      Returns:
      the aggregate snapshot wrapped in an Optional if a snapshot was found, otherwise Optional.empty()
    • loadAllSnapshots

      public <ID, AGGREGATE_IMPL_TYPE> List<AggregateSnapshot<ID,AGGREGATE_IMPL_TYPE>> loadAllSnapshots(AggregateType aggregateType, ID aggregateId, Class<AGGREGATE_IMPL_TYPE> aggregateImplType, boolean includeSnapshotPayload)
      Description copied from interface: AggregateSnapshotRepository
      Load all AggregateSnapshot's related to the given aggregate instance
      Specified by:
      loadAllSnapshots in interface AggregateSnapshotRepository
      Type Parameters:
      ID - the aggregate ID type
      AGGREGATE_IMPL_TYPE - the concrete aggregate implementation type
      Parameters:
      aggregateType - the aggregate type (determining the aggregate's event stream name)
      aggregateId - the identifier for the aggregate instance
      aggregateImplType - the concrete aggregate implementation type
      includeSnapshotPayload - should the AggregateSnapshot.aggregateSnapshot be loaded?
      Returns:
      list of all AggregateSnapshot's in ascending AggregateSnapshot.eventOrderOfLastIncludedEvent order (the oldest snapshot first) related to the given aggregate instance
    • aggregateUpdated

      public <ID, AGGREGATE_IMPL_TYPE> void aggregateUpdated(AGGREGATE_IMPL_TYPE aggregate, AggregateEventStream<ID> persistedEvents)
      Description copied from interface: AggregateSnapshotRepository
      Callback from an Aggregate Repository to notify that the aggregate has been updated
      Specified by:
      aggregateUpdated in interface AggregateSnapshotRepository
      Type Parameters:
      ID - the aggregate ID type
      AGGREGATE_IMPL_TYPE - the concrete aggregate implementation type
      Parameters:
      aggregate - the aggregate instance after the changes (in the form of events) has been marked as committed within the aggregate
      persistedEvents - the aggregate changes (in the form of events) after they've been persisted
    • deleteAllSnapshots

      public <AGGREGATE_IMPL_TYPE> void deleteAllSnapshots(Class<AGGREGATE_IMPL_TYPE> ofAggregateImplementationType)
      Description copied from interface: AggregateSnapshotRepository
      Delete all snapshots for the given aggregate implementation type
      Specified by:
      deleteAllSnapshots in interface AggregateSnapshotRepository
      Type Parameters:
      AGGREGATE_IMPL_TYPE - the concrete aggregate implementation type
      Parameters:
      ofAggregateImplementationType - the concrete aggregate implementation type that we want to delete all snapshots for
    • deleteSnapshots

      public <ID, AGGREGATE_IMPL_TYPE> void deleteSnapshots(AggregateType aggregateType, ID aggregateId, Class<AGGREGATE_IMPL_TYPE> withAggregateImplementationType)
      Description copied from interface: AggregateSnapshotRepository
      Delete all snapshots for the given aggregate instance with the given aggregate implementation type
      Specified by:
      deleteSnapshots in interface AggregateSnapshotRepository
      Type Parameters:
      ID - the aggregate ID type
      AGGREGATE_IMPL_TYPE - the concrete aggregate implementation type
      Parameters:
      aggregateType - the aggregate type (determining the aggregate's event stream name)
      aggregateId - the id of the aggregate that we want to delete all snapshots for
      withAggregateImplementationType - the concrete aggregate implementation type that we want to delete all snapshots for
    • deleteSnapshots

      public <ID, AGGREGATE_IMPL_TYPE> void deleteSnapshots(AggregateType aggregateType, ID aggregateId, Class<AGGREGATE_IMPL_TYPE> withAggregateImplementationType, List<EventOrder> snapshotEventOrdersToDelete)
      Description copied from interface: AggregateSnapshotRepository
      Delete all snapshots with a given AggregateSnapshot.eventOrderOfLastIncludedEvent for the given aggregate instance, with the given aggregate implementation type
      Specified by:
      deleteSnapshots in interface AggregateSnapshotRepository
      Type Parameters:
      ID - the aggregate ID type
      AGGREGATE_IMPL_TYPE - the concrete aggregate implementation type
      Parameters:
      aggregateType - the aggregate type (determining the aggregate's event stream name)
      aggregateId - the id of the aggregate that we want to delete all snapshots for
      withAggregateImplementationType - the concrete aggregate implementation type that we want to delete all snapshots for
      snapshotEventOrdersToDelete - The list of AggregateSnapshot.eventOrderOfLastIncludedEvent 's that should be deleted