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

时间:2016-07-11 15:16:52

标签: spring-boot jta spring-jms atomikos

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

  

当检测到JTA环境时,Spring的JtaTransactionManager   将用于管理交易。

“检测到JTA环境”是什么意思?

我问,因为我觉得这就是绊倒我的原因。我为Atomikos 添加了依赖项,但jmsTemplate.isSessionTransacted()返回false 。我假设我没有正确地将我的环境标记为JTA。我正在运行嵌入式tomcat。

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

更新

关于sessionTransacted的部分没有关联。这是我的误解。

2 个答案:

答案 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}}值。