Spring Boot 使用从 JNDI 检索到的事务管理器支持跨多个 XA 资源的分布式 JTA 事务。Spring中文文档

当检测到 JTA 环境时,Spring 用于管理事务。 自动配置的 JMS、DataSource 和 JPA Bean 已升级以支持 XA 事务。 您可以使用标准的 Spring 惯用语(如 )来参与分布式事务。 如果您位于 JTA 环境中,并且仍希望使用本地事务,则可以将该属性设置为禁用 JTA 自动配置。JtaTransactionManager@Transactionalspring.jta.enabledfalseSpring中文文档

使用 Jakarta EE 托管事务管理器

如果将 Spring Boot 应用程序打包为 or 文件并将其部署到 Jakarta EE 应用程序服务器,则可以使用应用程序服务器的内置事务管理器。 Spring Boot 尝试通过查看常见的 JNDI 位置(、 等)来自动配置事务管理器。 使用应用程序服务器提供的事务服务时,通常还希望确保所有资源都由服务器管理并通过 JNDI 公开。 Spring Boot 尝试通过在 JNDI 路径 ( 或 ) 中查找 来自动配置 JMS,您可以使用 spring.datasource.jndi-name 属性来配置 .warearjava:comp/UserTransactionjava:comp/TransactionManagerConnectionFactoryjava:/JmsXAjava:/XAConnectionFactoryDataSourceSpring中文文档

混合 XA 和非 XA JMS 连接

使用 JTA 时,主 JMS Bean 可识别 XA 并参与分布式事务。 您可以注入到您的豆子中,而无需使用任何:ConnectionFactory@QualifierSpring中文文档

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

在某些情况下,您可能希望使用非 XA 处理某些 JMS 消息。 例如,JMS 处理逻辑可能需要比 XA 超时更长的时间。ConnectionFactorySpring中文文档

如果你想使用一个 non-XA ,你可以 bean:ConnectionFactorynonXaJmsConnectionFactorySpring中文文档

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

为了保持一致性,还使用 bean 别名来提供 bean:jmsConnectionFactoryxaJmsConnectionFactorySpring中文文档

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

支持嵌入式事务管理器

XAConnectionFactoryWrapperXADataSourceWrapper 接口可用于支持嵌入式事务管理器。 接口负责包装 和 bean,并将它们公开为常规和 bean,它们透明地注册到分布式事务中。 DataSource 和 JMS 自动配置使用 JTA 变体,前提是您在 .XAConnectionFactoryXADataSourceConnectionFactoryDataSourceJtaTransactionManagerApplicationContextSpring中文文档