我正在尝试使用spring boot启用JTA,以便JPA和JMS一起回滚。所有文档都指向http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-jta.html,并指出
当检测到JTA环境时,Spring的JtaTransactionManager 将用于管理交易。
“检测到JTA环境”是什么意思?
我问,因为我觉得这就是绊倒我的原因。我为Atomikos 添加了依赖项,但。我假设我没有正确地将我的环境标记为JTA。我正在运行嵌入式tomcat。jmsTemplate.isSessionTransacted()
返回false
我遇到的是数据库更改正在回滚事务,而不是JMS消息。
更新
关于sessionTransacted
的部分没有关联。这是我的误解。
答案 0 :(得分:1)
您可以在课程org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration
中看到它:
@ConditionalOnClass(javax.transaction.Transaction.class)
@ConditionalOnProperty(prefix = "spring.jta", value = "enabled", matchIfMissing = true)
@AutoConfigureBefore({ XADataSourceAutoConfiguration.class,
ActiveMQAutoConfiguration.class, HornetQAutoConfiguration.class,
HibernateJpaAutoConfiguration.class })
@Import({ JndiJtaConfiguration.class, BitronixJtaConfiguration.class,
AtomikosJtaConfiguration.class, NarayanaJtaConfiguration.class })
@EnableConfigurationProperties(JtaProperties.class)
public class JtaAutoConfiguration {
}
基本上,您必须在类路径上拥有JTA API,并且至少有一个JTA提供程序(Bitronix或Atomikos,如果您不使用应用程序服务器)。
答案 1 :(得分:1)
当受支持的事务管理器位于类路径上时会检测到JTA环境(1.3中的Atomikos或Bitronix,以及1.4中的Narayana)或者因为JNDI中有javax.transaction.TransactionManager
可用(通常是因为您已部署了将应用程序引导到Java EE容器。)
我认为你误解了sessionTransacted
JmsTemplate
旗帜的目的。它在创建新会话(Connection.createSession
)时使用,但是当您在JTA环境中运行时,将忽略传递给transacted
的{{1}}值。