传入 JMS 消息的事务同步未激活

Transaction synchronization not active for incoming JMS message

我正在使用 Apache Camel 向我的 Java 服务发送消息。我一直在消费者路线上保持 transacted=true。我还需要发送有关成功处理 JMS 消息的电子邮件。

我正在使用以下代码注册同步并仅在事务提交后发送电子邮件。

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

问题: 来自 Camel 的传入交易未同步,我得到

java.lang.IllegalStateException: Transaction synchronization is not active

我尝试调用 transactionsynchronizationmanager.initsynchronization() - 我没有收到任何异常,但从未调用 afterCommit() 方法。

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

当通过 spring mvc 控制器(通过 Spring 事务)收到请求时,相同的代码正在运行。

您可能需要在路线上开启交易以启用 spring 交易。 JMS 端点上的选项 transacted=true 不是 spring-事务,但它仅用于将 JMS 确认模式设置为事务处理。他们不一样。

因此,在您的 Camel 路线中,还要设置 spring 交易,例如

from jms
  transacted

在 Camel 文档中查看更多详细信息:http://camel.apache.org/transactional-client.html 如果你有一本 Camel in Action 书(第一版或第二版),那么它有一个完整的章节专门介绍交易。