AnnotatedSagaManager, which is provided to an event processor to perform the actual invocation of handlers. It is initialized using the type of the saga to manage, as well as a
SagaRepositorywhere sagas of that type can be stored and retrieved. A single
AnnotatedSagaManagercan only manage a single saga type.
SagaStoreimplementation to use. The
SagaStoreis the mechanism that 'physically' stores the saga instances somewhere. The
AnnotatedSagaRepository(the default) uses the
SagaStoreto store and retrieve Saga instances as they are required.
SagaRepositoryis responsible for storing and retrieving sagas, for use by the
SagaManager. It is capable of retrieving specific saga instances by their identifier as well as by their association values.
AnnotatedSagaRepositoryimplementation, which allows the lookup of saga instances while guaranteeing that only a single instance of the saga may be accessed at the same time. It uses a
SagaStoreto perform the actual persistence of saga instances.
CachingSagaStorewhich wraps another implementation to add caching behavior. Note that the
CachingSagaStoreis a write-through cache, which means save operations are always immediately forwarded to the backing Store, to ensure data safety.
JpaSagaStoreuses JPA to store the state and association values of sagas. Sagas themselves do not need any JPA annotations; Axon will serialize the sagas using a
Serializer(similar to event serialization, you can choose between an
JacksonSerializer, which can be set by configuring the default
Serializerin your application. For more details, see Serializers.
JpaSagaStoreis configured with an
EntityManagerProvider, which provides access to an
EntityManagerinstance to use. This abstraction allows for the use of both application managed and container managed
EntityManagers. Optionally, you can define the serializer to serialize the Saga instances with. Axon defaults to the
JdbcSagaStoreuses plain JDBC to store stage instances and their association values. Similar to the
JpaSagaStore, saga instances do not need to be aware of how they are stored. The store serializes the saga instances using a serializer.
JdbcSagaStorewith either a
ConnectionProvider. While not required, when initializing with a
ConnectionProvider, it is recommended to wrap the implementation in a
UnitOfWorkAwareConnectionProviderWrapper. It will check the current Unit of Work for an already open database connection to ensure that all activity within a unit of work is done on a single connection.
JdbcSagaRepositoryuses plain SQL statements to store and retrieve information. This approach may mean that some operations depend on the database-specific SQL dialect. It may also be that certain database vendors provide non-standard features that you would like to use. To allow for this, you can provide your own
SagaSqlSchemais an interface that defines all the operations the repository needs to perform on the underlying database. It allows you to customize the SQL statement executed for each operation. The default is the
GenericSagaSqlSchema. Other implementations available are
Schema ConstructionNote that Axon does not create the database schema for you out of the box. Neither when using Spring Boot, for example.To construct the schema,
JdbcSagaStore#createSchemashould be invoked. By default, this will use the
GenericSagaSqlSchema. You can change the schema by configuring a different version through the
MongoSagaStorestores the saga instances and their associations in a MongoDB database. The
MongoSagaStorestores all sagas in a single collection in a MongoDB database. For each saga instance, a single document is created.
MongoSagaStorealso ensures that at any time, only a single Saga instance exists for any unique Saga in a single JVM. This ensures that no state changes are lost due to concurrency issues.
MongoSagaStoreis initialized using a
MongoTemplateand optionally a
MongoTemplateprovides a reference to the collection to store the sagas in. Axon provides the
DefaultMongoTemplate, which takes a
MongoClientinstance as well as the database name and name of the collection to store the sagas in. The database name and collection name may be omitted. In that case, they default to
CachingSagaStoreimplementation. It is a
SagaStorethat wraps another one, which does the actual storage. When loading sagas or association values, the
CachingSagaStorewill first consult its caches, before delegating to the wrapped repository. When storing information, all calls are always delegated to ensure that the backing storage always has a consistent view on the saga's state.
CachingSagaStore. The constructor of the
CachingSagaStoretakes three parameters: 1. The
SagaStoreto wrap 2. The cache to use for association values 3. The cache to use for saga instances