Повтор событий может включать в себя тысячи, если не миллионы событий. Поэтому часто невозможно реализовать один повтор в одной транзакции (при условии, что ваши прослушиватели событий вносят изменения, требующие транзакций).
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)
уведомить приложение, которое будет управлять этими операционным самим (это не повлияет на управление транзакциями в другом месте).