带有 JTA 事务的 Axon ReplayingCluster

Axon ReplayingCluster with JTA transaction

对于我的 Java EE (7) 项目,我想使用 Axon 框架。 Axon的参数之一ReplayingCluster是一个TransactionManager,但是Axon只支持NoTransactionManagerSpringTransactionManager

但是如果我没有弄错 JTA,事务已经由 EntityManager 中的应用程序服务器管理(我已将其存储在 JpaEventStore 中)。

我的问题:当我将 ReplayingClusterNoTransactionManager 一起使用时,这是否意味着 JTA 仍将提供事务功能?

事件回放可能涉及数千甚至数百万个事件。因此,在单个事务中管理单个重放通常是不可行的(假设您的事件侦听器进行的更改完全需要事务)。

Axon 在重播期间使用 TransactionManager 来在每次重播一批事件时提交更改。此批处理的大小可使用 commitThreshold 参数进行配置。

现在,我没有使用 JTA 的经验,但我的理解是,当调用 bean 方法并在该方法提交时自动创建事务 returns。这意味着当您触发重放时,它将在单个事务中完成。

因此,我的建议是向 ReplayingCluster 提供您自己的实现。在 EJB 服务器上,此实现可能如下所示:

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();
    }

}

然后,您可以使用 @TransactionManagement(BEAN) 注释启动重放的 bean,以通知应用程序您将自己管理这些事务(这不会影响其他地方的事务管理)。