使用 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 容器)。
我认为您误解了 JmsTemplate
上 sessionTransacted
标志的用途。它在创建新会话 (Connection.createSession
) 时使用,但是当您在 JTA 环境中 运行 时,传递给 createSession
的 transacted
值将被忽略。
我正在尝试通过 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 添加了依赖项,但是 。我假设我没有正确地将我的环境标记为 JTA。我是 运行 嵌入式 tomcat.jmsTemplate.isSessionTransacted()
returns false
我遇到的是数据库更改随事务一起回滚,而不是 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 容器)。
我认为您误解了 JmsTemplate
上 sessionTransacted
标志的用途。它在创建新会话 (Connection.createSession
) 时使用,但是当您在 JTA 环境中 运行 时,传递给 createSession
的 transacted
值将被忽略。