【问题标题】:Axon ReplayingCluster with JTA transaction带有 JTA 事务的 Axon ReplayingCluster
【发布时间】:2016-09-21 08:29:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: jakarta-ee transactions jta axon


    【解决方案1】:

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

    Axon 在重播期间使用TransactionManager 在每次重播一批事件时提交更改。此批次的大小可使用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();
        }
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      相关资源
      最近更新 更多