数百万回のイベントであっても、数千ものイベントが再生される場合があります。したがって、単一のトランザクションで単一の再生を管理することは、しばしば実現できません(イベントリスナーがトランザクションを必要とする変更を行ったと仮定して)。
Axonはリプレイ中にイベントのバッチが再生されるたびに変更をコミットするためにTransactionManager
を使用します。このバッチのサイズは、commitThreshold
パラメータを使用して設定できます。
私はJTAの経験はありませんが、Beanメソッドが呼び出され、そのメソッドが返されたときにコミットされるとトランザクションが自動的に作成されることを理解しています。つまり、再生をトリガーすると、1回のトランザクションで再生されます。
私のアドバイスは、ReplayingCluster
に独自の実装を提供することです。
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)
でリプレイを開始豆に注釈を付けることができます(他の場所で、この影響しませんトランザクション管理:EJBサーバでは、この実装では、このようなものに見えるかもしれません)。