使用 spring 引导,它如何检测 JTA 环境?

With spring boot, how does it detect a JTA environment?

我正在尝试通过 spring 引导启用 JTA,以便 JPA 和 JMS 一起回滚。所有文档都指向 http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-jta.html 并指出

When a JTA environment is detected, Spring’s JtaTransactionManager will be used to manage transactions.

"JTA environment is detected"是什么意思?

我问是因为我认为这是让我感到困惑的原因。我为 Atomikos 添加了依赖项,但是 jmsTemplate.isSessionTransacted() returns false。我假设我没有正确地将我的环境标记为 JTA。我是 运行 嵌入式 tomcat.

我遇到的是数据库更改随事务一起回滚,而不是 JMS 消息。

更新:

关于 sessionTransacted 的部分与此无关。这是我的误会。

您可以在 class 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 {

}

基本上,您必须在 class 路径上安装 JTA API,并且至少有一个 JTA 提供程序(Bitronix 或 Atomikos,如果您不使用应用程序服务器)。

当受支持的事务管理器位于类路径(1.3 中的 Atomikos 或 Bitronix,以及 1.4 中的 Narayana)或因为 javax.transaction.TransactionManager 在 JNDI 中可用(通常是因为您已经将您的 Boot 应用程序部署到 Java EE 容器)。

我认为您误解了 JmsTemplatesessionTransacted 标志的用途。它在创建新会话 (Connection.createSession) 时使用,但是当您在 JTA 环境中 运行 时,传递给 createSessiontransacted 值将被忽略。