2017-09-17 105 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

好的,也许你会将这个问题标记为回答 –