我正在使用Apache Camel向我的Java服务发送消息。我已将transacted=true
保留在消费者路线上。我还需要在成功处理JMS消息时发送电子邮件。
我使用以下代码注册同步并仅在提交交易后发送电子邮件。
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
@Override
public void afterCommit(){
sendMail(mailBody);
}
});
问题:来自Camel的传入事务未同步,我正在
java.lang.IllegalStateException:事务同步未激活
我尝试调用transactionsynchronizationmanager.initsynchronization()
- 我没有得到任何异常,但永远不会调用afterCommit()
方法。
transactionsynchronizationmanager.initsynchronization();
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
@Override
public void afterCommit(){
sendMail(mailBody); //never called
}
});
当通过spring mvc controller(通过Spring Transaction)收到请求时,相同的代码正在工作。
答案 0 :(得分:1)
您可能需要在路线上启用交易以启用春季交易。 JMS端点上的选项transacted=true
不是spring-transaction,但它仅用于将JMS确认模式设置为事务处理。它们不一样。
因此,在您的Camel路线中,也设置弹簧交易,例如
from jms
transacted
在Camel文档中查看更多详细信息:http://camel.apache.org/transactional-client.html或者如果您有一本Camel in Action手册(第1版或第2版)的更多内容,那么它会有一个专门讨论交易的完整章节。