使用 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,这些 Bean 会透明地注册到分布式事务中。DataSource 和 JMS 自动配置使用 JTA 变体,前提是您在ApplicationContext
中注册了JtaTransactionManager
Bean 和相应的 XA 包装 Bean。