事件回放可能涉及数千甚至数百万个事件。因此,在单个事务中管理单个重播通常是不可行的(假设您的事件侦听器进行了需要事务的更改)。
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)
以通知应用程序您将自己管理这些事务(这不会影响其他地方的事务管理)。