此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.4.0spring-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.enabledproperty 设置为false以禁用 JTA 自动配置。spring-doc.cadn.net.cn

使用 Jakarta EE Managed Transaction Manager

如果您将 Spring Boot 应用程序打包为warear文件并将其部署到 Jakarta EE 应用服务器,则可以使用应用服务器的内置事务管理器。 Spring Boot 尝试通过查看常见的 JNDI 位置(java:comp/UserTransaction,java:comp/TransactionManager等)。 使用应用程序服务器提供的事务服务时,您通常还希望确保所有资源都由服务器管理并通过 JNDI 公开。 Spring Boot 尝试通过查找ConnectionFactory在 JNDI 路径 (java:/JmsXAjava:/XAConnectionFactory),并且您可以使用spring.datasource.jndi-name财产要配置DataSource.spring-doc.cadn.net.cn

混合 XA 和非 XA JMS 连接

使用 JTA 时,主 JMSConnectionFactorybean 是 XA 感知的,并参与分布式事务。 您可以注入到 bean 中,而无需使用任何@Qualifier:spring-doc.cadn.net.cn

import jakarta.jms.ConnectionFactory;

public class MyBean {

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

}
import jakarta.jms.ConnectionFactory

class MyBean(connectionFactory: ConnectionFactory?)

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

如果要使用非 XAConnectionFactory,您可以nonXaJmsConnectionFactory豆: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?)

为了保持一致性,jmsConnectionFactorybean 也是通过使用 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接口可用于支持嵌入式事务管理器。 接口负责包装XAConnectionFactoryXADataSourcebean 并将它们公开为常规ConnectionFactoryDataSourcebean,它们以透明方式注册分布式事务。 DataSource 和 JMS 自动配置使用 JTA 变体,前提是您有一个JtaTransactionManagerbean 和相应的 XA 包装器 bean 中注册的ApplicationContext.spring-doc.cadn.net.cn