2016-09-21 1 views
0

Pour mon projet Java EE (7), je souhaite utiliser le framework Axon. L'un des paramètres de l'Axon ReplayingCluster est un TransactionManager, mais Axon ne prend en charge que NoTransactionManager et SpringTransactionManager. Mais si je ne me trompe pas avec JTA, les transactions sont déjà gérées par le serveur d'application dans le EntityManager (que j'ai stocké dans le JpaEventStore).Axon ReplayingCluster avec transaction JTA

Ma question: quand j'utilise ReplayingCluster avec NoTransactionManager, cela signifie-t-il que JTA continuera de fournir des fonctionnalités de transactions?

Répondre

2

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).