2016-09-21 8 views
0

私のJava EE(7)プロジェクトではAxonフレームワークを使用したいと思います。 Axon ReplayingClusterのパラメータの1つはTransactionManagerですが、AxonはNoTransactionManagerSpringTransactionManagerのみをサポートしています。Axon ReplayingCluster with JTAトランザクション

しかし、もし私がJTAと間違っていないのであれば、トランザクションはすでにEntityManager(私がJpaEventStoreに保存している)のアプリケーションサーバによって管理されています。

私の質問:ReplayingClusterNoTransactionManagerと使用すると、JTAはトランザクション機能を提供しますか?

答えて

2

数百万回のイベントであっても、数千ものイベントが再生される場合があります。したがって、単一のトランザクションで単一の再生を管理することは、しばしば実現できません(イベントリスナーがトランザクションを必要とする変更を行ったと仮定して)。

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サーバでは、この実装では、このようなものに見えるかもしれません)。

関連する問題