0

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

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

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

4

1 回答 1

3

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

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

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

因此,我的建议是为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();
    }

}

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

于 2016-09-22T11:08:16.093 回答