【问题标题】:With spring boot, how does it detect a JTA environment?使用spring boot,它如何检测JTA环境?
【发布时间】:2016-07-11 15:16:52
【问题描述】:

我正在尝试使用 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 的部分不相关。这是我的误解。

【问题讨论】:

    标签: spring-boot jta spring-jms atomikos


    【解决方案1】:

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

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

    【讨论】:

    • 一位同事指出了你所说的关于sessionTransacted 的内容,所以我猜那是在转移注意力。事务回滚时正在发送 JMS 消息。
    【解决方案2】:

    可以在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,如果您不使用应用程序服务器)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2021-09-29
      • 2015-07-07
      • 2017-05-20
      相关资源
      最近更新 更多