2016-06-21 3 views
1

JpaTransactionManagermyJpaTm)とJmsTransactionManagermyJmsTm)の2つのトランザクションマネージャがあります。JPAトランザクション後のSpringコミットJMSトランザクション

は、コードを次の点を考慮

@Named 
public class TestA { 
    @Inject TestB testB; 

    @Transactional(transactionManager="myJpaTm") 
    public void methoda() { 
    // store stuff in db 
    testB.methodb(); 
    } 
} 

@Named 
public class TestB { 

    @Transactional(transactionManager="myJmsTm") 
    public void methodb() { 
    // send few JMS messages 
    } 
} 

我々は外JPAトランザクションと内側JMSトランザクションを持って、我々は分散トランザクションを使用していないので、両方が分離されています。

JPAトランザクションをコミットした直後にJMSトランザクションをコミットしたいとします。この場合、現在のJMSトランザクションは親のJPAトランザクションに接続する必要があります。

私は分散トランザクションの代用を探していませんが、データをデータベースにコミットした後にJMSメッセージを送信したいだけです。

私はちょうどmethodaとその後のmethodbを呼び出すことができる別のクラスを作成することができますが、両方のトランザクションを一緒に接続して解決したいと思います。

答えて

0

私はこれまで、TransactionSynchronizationManagerを使用し、同期のためにafterCommitメソッドにメッセージブロックを追加しました。基本的に、あなたの実装ではこのような何かを配置する必要があります:私はまた別のオプションを見つけた

@Named 
public class TestA{ 

@Inject 
TestB testB; 

@Transactional(transactionManager="myJpaTm") 
public void methoda() { 
    // other db stuff 
    if(TransactionSynchronizationManager.isActualTransactionActive()){ 
     TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){ 
       @Override 
       public void afterCommit(){ 
        testB.methodb(); 
       } 
     }); 
    } 
    } 
} 
0

- 私たちはspring-data-commonsからChainedTransactionManagerを使うことができます適切な順序で2つのトランザクションマネージャチェーン。

@Configuration 
public class ChainedTransactionConfiguration { 
    @Bean 
    public ChainedTransactionManager chainedTransactionManager(
     @Named("myJpaTm") JpaTransactionManager myJpaTm, 
     @Named("myJmsTm") JmsTransactionManager myJmsTm) { 
    return new ChainedTransactionManager(myJmsTm, myJpaTm); 
    } 
} 

今私は新しいTMを設定する必要があります。

@Named 
public class TestA { 
    @Inject TestB testB; 

    @Transactional(transactionManager="chainedTransactionManager") 
    public void methoda() { 
    // store stuff in db 
    testB.methodb(); 
    } 
} 

@Named 
public class TestB { 

    @Transactional(transactionManager="myJmsTm") 
    public void methodb() { 
    // send few JMS messages 
    } 
} 
関連する問題