2017-09-17 3 views
2

Apache Camelを使用してJavaサービスにメッセージを送信しています。私は消費者ルートにtransacted=trueを保管しています。また、JMSメッセージの処理が正常に完了したら電子メールを送信する必要があります。着信JMSメッセージに対してトランザクション同期が有効でない

私は以下のコードを使用して同期を登録し、トランザクションがコミットされた後にのみ電子メールを送信します。

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){ 
    @Override 
    public void afterCommit(){ 
     sendMail(mailBody); 
    } 
}); 

問題:キャメルからの着信トランザクションが同期されていないと私は

java.lang.IllegalStateExceptionを取得しています:トランザクションの同期化は、私がtransactionsynchronizationmanager.initsynchronization()を呼び出してみました

アクティブではありません - 何も例外はありませんが、afterCommit()メソッドは呼び出されません。

transactionsynchronizationmanager.initsynchronization(); 
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){ 
    @Override 
    public void afterCommit(){ 
     sendMail(mailBody); //never called 
    } 
}); 

同じコードが要求(春トランザクションを通じて)Spring MVCのコントローラを介して受信されたときに作動されます。

答えて

1

春の取引を有効にするには、経路上の取引を有効にする必要があります。 JMSエンドポイントのオプションtransacted=trueは、スプリングトランザクションではなく、JMSアクノレッジモードをトランザクションとして設定する場合にのみ使用されます。彼らは同じではありません。

だからあなたのラクダのルート、セットアップ春の取引においても、例えば

from jms 
    transacted 

キャメルのドキュメントで詳細を参照してください:あなたはアクション帳にキャメルのコピーを持っている場合、第一(http://camel.apache.org/transactional-client.htmlまたはより良いですか第2版​​)、それはトランザクションに専念した完全な章を持っています。

+0

ありがとうございました。ルート上でtransacted = trueを設定した後で動作します。実際には、JMSConfigutaionでtransacted = trueを設定しましたが、これは間違っています。 –

+0

さて、あなたはこの質問に答えてマークして –

関連する問題