Les replays d'événements peuvent impliquer des milliers voire des millions d'événements. Par conséquent, il est souvent impossible de gérer une seule relecture en une seule transaction (en supposant que vos écouteurs d'événement apportent des modifications qui nécessitent des transactions du tout).
Axon utilise un TransactionManager
lors des replays pour valider les modifications chaque fois qu'un lot d'événements est relu. La taille de ce lot est configurable à l'aide du paramètre commitThreshold
.
Maintenant, je n'ai pas l'expérience de l'utilisation de JTA mais je crois comprendre qu'une transaction est automatiquement créée lorsqu'une méthode bean est invoquée et validée lorsque cette méthode revient. Cela signifie que lorsque vous déclenchez une relecture, il le fera en une seule transaction.
Mon conseil est donc de fournir votre propre implémentation au ReplayingCluster
. Sur un serveur EJB cette implémentation peut ressembler à ceci:
class JtaTransactionManager implements TransactionManager<UserTransaction> {
@Resource
private SessionContext ctx;
@Override
public UserTransaction startTransaction() {
UserTransaction utx = ctx.getUserTransaction();
utx.begin();
return utx;
}
@Override
public void commitTransaction(UserTransaction utx) {
utx.commit();
}
@Override
public void rollbackTransaction(UserTransaction utx) {
utx.rollback();
}
}
Vous pouvez annoter le haricot qui initie la lecture avec @TransactionManagement(BEAN)
pour notifier l'application que vous allez gérer ces opérations vous-même (ce ne sera pas une incidence sur la gestion des transactions ailleurs).