与JTA的分布式事务

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

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

使用 Jakarta EE 托管事务管理器

如果你把 Spring Boot 应用打包成战争耳朵文件并部署到雅加达EE应用服务器,你可以使用应用服务器内置的事务管理器。Spring Boot尝试通过查看常见的JNDI位置来自动配置事务管理器(java:comp/UserTransaction,java:comp/TransactionManager,依此类推)。使用应用服务器提供的事务服务时,通常还希望确保所有资源均由服务器管理并通过JNDI公开。Spring Boot尝试通过寻找连接工厂在JNDI路径(java:/JmsXAjava:/XAConnectionFactory),你可以使用Spring.datasource.jndi-name属性配置你的数据来源.spring-doc.cadn.net.cn

混合XA和非XA JMS连接

使用 JTA 时,主要的 JMS连接工厂豆子是XA识别的,并参与分布式交易。你可以在没有任何东西的情况下注入到你的豆子里@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消息连接工厂. 例如,你的JMS处理逻辑可能比XA超时时间更长。spring-doc.cadn.net.cn

如果你想用非XA的话连接工厂,你可以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?)

为了保持一致性,以下jms连接工厂豆子也通过豆子别名提供xaJms连接工厂: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接口可用于支持嵌入式事务管理器。接口负责封装XAConnection工厂XADataSource豆子并将它们当作普通的连接工厂数据来源豆子,这些 beans 透明地注册到分布式事务中。DataSource 和 JMS 自动配置使用 JTA 变体,前提是你有JtaTransactionManager豆子和合适的XA包装豆子注册在你的应用上下文.spring-doc.cadn.net.cn