事件重播可能涉及數千甚至數百萬事件。因此,在單個事務中管理單個重播通常是不可行的(假設您的事件偵聽器進行需要事務處理的更改)。
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)
啓動重播豆通知,你將親自管理這些交易的應用程序(這不會影響交易管理別處)。