イベントのリプレイには、数百万ではないにしても数千のイベントが含まれる場合があります。したがって、単一のトランザクションで単一のリプレイを管理することは、多くの場合現実的ではありません (イベント リスナーがトランザクションを必要とする変更を行うと仮定します)。
Axon はTransactionManager
during replays を使用して、イベントのバッチが再生されるたびに変更をコミットします。このバッチのサイズは、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)
これらのトランザクションを自分で管理することをアプリケーションに通知できます (これは、他の場所でのトランザクション管理には影響しません)。