2017-09-17 106 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控制器(通過Spring Transaction)收到請求時,相同的代碼正在工作。

回答

1

您可能需要打開路線上的交易以啓用春季交易。 JMS端點上的選項transacted=true不是spring-transaction,但它僅用於將JMS確認模式設置爲事務處理。他們不一樣。

所以在你的駱駝航線,設置Spring事務爲好,如

from jms 
    transacted 

查看更多細節駱駝文檔:http://camel.apache.org/transactional-client.html甚至更​​好,如果你有駱駝在行動出版的書(第1或第二版),那麼它有一個完整的章節專門討論交易。

+0

非常感謝。在路由上設置transacted = true後,它正在工作。我實際上在JMSConfigutaion中設置了transacted = true,這是不正確的。 –

+0

好的,也許你會將這個問題標記爲回答 –