当检测到 JTA 环境时,Spring 的 将用于管理事务。自动配置的 JMS、DataSource 和 JPA bean 已升级为支持 XA 事务。您可以使用标准的 Spring 方式(例如 @Transactional
)来使用分布式事务。如果您处于 JTA 环境中并且仍想使用本地事务,则可以将 spring.jta.enabled
属性设置为 false
以禁用 JTA 自动配置。
Atomikos 是一个流行的开源事务管理器,可以嵌入到 Spring Boot 应用程序中。您可以使用 spring-boot-starter-jta-atomikos
starter 来获取相应的 Atomikos 库。Spring Boot 自动配置 Atomikos 并确保将合适的依赖设置应用于 Spring bean,以确保启动和关闭顺序正确。
默认情况下,Atomikos 事务日志将写入应用程序主目录(应用程序 jar 文件所在的目录)中的 transaction-logs
目录。您可以通过在 application.properties
文件中设置 spring.jta.log-dir
属性来自定义此目录的位置。也可用 spring.jta.atomikos.properties
开头的属性来自定义 Atomikos UserTransactionServiceImp
。有关完整的详细信息,请参阅 。
注意
Bitronix 是一个流行的开源 JTA 事务管理器实现。您可以使用 spring-boot-starter-jta-bitronix
starter 为您的项目添加合适的 Bitronix 依赖。与 Atomikos 一样,Spring Boot 会自动配置 Bitronix 并对 bean 进行后处理(post-processes),以确保启动和关闭顺序正确。
默认情况下,Bitronix 事务日志文件(part1.btm
和 part2.btm
)将写入应用程序主目录中的 transaction-logs
目录。您可以通过设置 属性来自定义此目录的位置。以 spring.jta.bitronix.properties
开头的属性绑定到了 bitronix.tm.Configuration
bean,允许完全自定义。有关详细信息,请参阅 。
注意
为确保多个事务管理器能够安全地协调相同的资源管理器,必须为每个 Bitronix 实例配置唯一的 ID。默认情况下,此 ID 是运行 Bitronix 的计算机的 IP 地址。生产环境要确保唯一性,应为应用程序的每个实例配置
spring.jta.transaction-manager-id
属性,并使用不同的值。
如果将 Spring Boot 应用程序打包为 war
或 ear
文件并将其部署到 Java EE 应用程序服务器,则可以使用应用程序服务器的内置事务管理器。Spring Boot 尝试通过查找常见的 JNDI 位置(java:comp/UserTransaction
、java:comp/TransactionManager
等)来自动配置事务管理器。如果使用应用程序服务器提供的事务服务,通常还需要确保所有资源都由服务器管理并通过 JNDI 暴露。Spring Boot 尝试通过在 JNDI 路径(java:/JmsXA
或 java:/JmsXA
)中查找 ConnectionFactory
来自动配置 JMS,并且可以使用 来配置 DataSource
。
使用 JTA 时,主 JMS ConnectionFactory
bean 可识别 XA 并参与分布式事务。在某些情况下,您可能希望使用非 XA ConnectionFactory
处理某些 JMS 消息。例如,您的 JMS 处理逻辑可能需要比 XA 超时时间更长的时间。
如果要使用非 XA ,可以注入 nonXaJmsConnectionFactory
bean 而不是 @Primary
jmsConnectionFactory
bean。为了保持一致性,提供的 jmsConnectionFactory
bean 还需要使用 xaJmsConnectionFactory
别名。
以下示例展示了如何注入 ConnectionFactory
实例:
和 XADataSourceWrapper
接口可用于支持其他嵌入式事务管理器。接口负责包装 XAConnectionFactory
和 XADataSource
bean,并将它们公开为普通的 ConnectionFactory
和 DataSource
bean,它们透明地加入分布式事务。DataSource
和 JMS 自动配置使用 JTA 变体,前提是您需要有一个 JtaTransactionManager
bean 和在 中注册有的相应 XA 包装器(wrapper) bean。
和 BitronixXADataSourceWrapper 为如何编写 XA 包装器提供了很好示例。