|
此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Boot 4.0.4! |
使用 JTA 的分布式事务
Spring Boot 支持通过使用从 JNDI 获取的事务管理器,在多个 XA 资源之间进行分布式 JTA 事务。
当检测到 JTA 环境时,Spring 的 JtaTransactionManager 用于管理事务。
自动配置的 JMS、DataSource 和 JPA Bean 会升级以支持 XA 事务。
您可以使用标准的 Spring 惯用法,例如 @Transactional,来参与分布式事务。
如果您处于 JTA 环境中但仍希望使用本地事务,可以将 spring.jta.enabled 属性设置为 false 以禁用 JTA 自动配置。
使用 Jakarta EE 托管事务管理器
如果您将 Spring Boot 应用程序打包为 war 或 ear 文件并将其部署到 Jakarta EE 应用服务器,您可以使用该应用服务器内置的事务管理器。
Spring Boot 会通过查看常见的 JNDI 位置(java:comp/UserTransaction、java:comp/TransactionManager 等)来尝试自动配置事务管理器。
当使用由应用服务器提供的事务服务时,您通常还需要确保所有资源都由服务器管理并通过 JNDI 暴露。
Spring Boot 会通过查找 JNDI 路径(java:/JmsXA 或 java:/XAConnectionFactory)下的 ConnectionFactory 来尝试自动配置 JMS,并且您可以使用 spring.datasource.jndi-name 属性 来配置您的 DataSource。
混合使用 XA 和非 XA JMS 连接
使用 JTA 时,主要的 JMS ConnectionFactory bean 支持 XA 并参与分布式事务。
你可以将其注入到你的 bean 中,而无需使用任何 @Qualifier:
-
Java
-
Kotlin
import jakarta.jms.ConnectionFactory;
public class MyBean {
public MyBean(ConnectionFactory connectionFactory) {
// ...
}
}
import jakarta.jms.ConnectionFactory
class MyBean(connectionFactory: ConnectionFactory?)
在某些情况下,您可能希望使用非 XA ConnectionFactory 来处理某些 JMS 消息。
例如,您的 JMS 处理逻辑可能比 XA 超时时间更长。
如果您想使用非 XA ConnectionFactory,您可以使用 nonXaJmsConnectionFactory bean:
-
Java
-
Kotlin
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 提供:
-
Java
-
Kotlin
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?)
支持嵌入式事务管理器
XAConnectionFactoryWrapper 和 XADataSourceWrapper 接口可用于支持嵌入式事务管理器。
这些接口负责包装 XAConnectionFactory 和 XADataSource Bean,并将它们作为普通的 ConnectionFactory 和 DataSource Bean 暴露出来,从而透明地参与分布式事务。
DataSource 和 JMS 的自动配置会使用 JTA 变体,前提是您有一个 JtaTransactionManager Bean,并且已在您的 ApplicationContext 中注册了相应的 XA 包装 Bean。