2016-09-21 4 views
0

Java EE (7) 프로젝트에서 Axon 프레임 워크를 사용하고 싶습니다. Axon ReplayingCluster의 매개 변수 중 하나는 TransactionManager이지만 Axon은 NoTransactionManagerSpringTransactionManager 만 지원합니다.Axon ReplayingCluster with JTA 트랜잭션

하지만 내가 JTA와 혼동하지 않는다면 트랜잭션은 이미 EntityManager (JpaEventStore에 저장되어있는)의 응용 프로그램 서버에 의해 관리됩니다.

내 질문 : ReplayingClusterNoTransactionManager과 함께 사용하면 JTA는 여전히 트랜잭션 기능을 제공합니까?

답변

2

이벤트 재생에는 수천만 건의 이벤트가 포함될 수 있습니다. 따라서 단일 트랜잭션에서 단일 재생을 관리하는 것은 종종 가능하지 않습니다 (이벤트 리스너가 트랜잭션을 필요로하는 변경을한다고 가정 할 때).

Axon은 재생 중에 이벤트 일괄 처리가 재생 될 때마다 변경 내용을 커밋하기 위해 TransactionManager을 사용합니다. 이 일괄 처리의 크기는 commitThreshold 매개 변수를 사용하여 구성 할 수 있습니다.

이제는 JTA를 사용해 본 경험이 없지만 bean 메소드가 호출되고 해당 메소드가 반환 될 때 트랜잭션이 자동으로 생성된다는 사실을 이해했습니다. 즉, 재생을 트리거하면 단일 트랜잭션에서 재생됩니다.

따라서 내 조언은 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 서버에서이 구현은 다음과 같이 보일 수 있습니다).

관련 문제