此版本仍在开发中,尚未视为稳定版。如需最新稳定版本,请使用 Spring Boot 4.0.4spring-doc.cadn.net.cn

分布式事务与JTA

Spring Boot 通过使用从 JNDI 获取的事务管理器,支持跨多个 XA 资源的分布式 JTA 事务。spring-doc.cadn.net.cn

当检测到 JTA 环境时,将使用 Spring 的 JtaTransactionManager 来管理事务。 自动配置的 JMS、DataSource 和 JPA bean 已升级以支持 XA 事务。 您可以使用标准的 Spring 习惯用法,例如 @Transactional,来参与分布式事务。 如果您处于 JTA 环境中但仍希望使用本地事务,可以将 spring.jta.enabled 属性设置为 false 以禁用 JTA 自动配置。spring-doc.cadn.net.cn

使用 Jakarta EE 托管事务管理器

如果您将 Spring Boot 应用程序打包为 warear 文件并将其部署到 Jakarta EE 应用服务器,您可以使用该应用服务器内置的事务管理器。 Spring Boot 会通过查看常见的 JNDI 位置(java:comp/UserTransactionjava:comp/TransactionManager 等)来尝试自动配置事务管理器。 当使用应用服务器提供的事务服务时,通常还需要确保所有资源都由服务器管理并通过 JNDI 暴露。 Spring Boot 会尝试通过在 JNDI 路径(java:/JmsXAjava:/XAConnectionFactory)查找 ConnectionFactory 来自动配置 JMS,并且您可以使用 spring.datasource.jndi-name 属性 来配置您的 DataSourcespring-doc.cadn.net.cn

混合使用 XA 和非 XA JMS 连接

当使用 JTA 时,主要的 JMS ConnectionFactory Bean 是 XA 感知的,并参与分布式事务。 您可以直接将其注入到您的 Bean 中,而无需使用任何 @Qualifierspring-doc.cadn.net.cn

import jakarta.jms.ConnectionFactory;

public class MyBean {

	public MyBean(ConnectionFactory connectionFactory) {
		// ...
	}

}
import jakarta.jms.ConnectionFactory

class MyBean(connectionFactory: ConnectionFactory?)

在某些情况下,您可能希望使用非 XA ConnectionFactory 来处理特定的 JMS 消息。 例如,您的 JMS 处理逻辑所花费的时间可能会超过 XA 超时时间。spring-doc.cadn.net.cn

如果您想使用非 XA ConnectionFactory,您可以使用 nonXaJmsConnectionFactory Bean:spring-doc.cadn.net.cn

import jakarta.jms.ConnectionFactory;

import org.springframework.beans.factory.annotation.Qualifier;

public class MyBean {

	public MyBean(@Qualifier("nonXaJmsConnectionFactory") ConnectionFactory connectionFactory) {
		// ...
	}

}
import jakarta.jms.ConnectionFactory
import org.springframework.beans.factory.annotation.Qualifier

class MyBean(@Qualifier("nonXaJmsConnectionFactory") connectionFactory: ConnectionFactory?)

为保持一致性,jmsConnectionFactory bean 也通过使用 bean 别名 xaJmsConnectionFactory 提供:spring-doc.cadn.net.cn

import jakarta.jms.ConnectionFactory;

import org.springframework.beans.factory.annotation.Qualifier;

public class MyBean {

	public MyBean(@Qualifier("xaJmsConnectionFactory") ConnectionFactory connectionFactory) {
		// ...
	}

}
import jakarta.jms.ConnectionFactory
import org.springframework.beans.factory.annotation.Qualifier

class MyBean(@Qualifier("xaJmsConnectionFactory") connectionFactory: ConnectionFactory?)

支持嵌入式事务管理器

XAConnectionFactoryWrapperXADataSourceWrapper 接口可用于支持嵌入式事务管理器。 这些接口负责包装 XAConnectionFactoryXADataSource Bean,并将它们暴露为常规的 ConnectionFactoryDataSource Bean,从而透明地加入分布式事务。 只要您的 ApplicationContext 中注册了 JtaTransactionManager Bean 以及适当的 XA 包装器 Bean,DataSource 和 JMS 的自动配置就会使用 JTA 变体。spring-doc.cadn.net.cn