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