【问题标题】:Axon ReplayingCluster with JTA transaction带有 JTA 事务的 Axon ReplayingCluster
【发布时间】:2016-09-21 08:29:32
【问题描述】:
对于我的 Java EE (7) 项目,我想使用 Axon 框架。
AxonReplayingCluster的参数之一是TransactionManager,但Axon只支持NoTransactionManager和SpringTransactionManager。
但如果我没记错的话,事务已经由EntityManager 中的应用程序服务器管理(我已存储在JpaEventStore 中)。
我的问题:当我使用 ReplayingCluster 和 NoTransactionManager 时,这是否意味着 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,以通知应用程序您将自己管理这些事务(这不会影响其他地方的事务管理)。