此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.4.3! |
使用 JTA 的分布式事务
Spring Boot 通过使用从 JNDI 检索的事务管理器来支持跨多个 XA 资源的分布式 JTA 事务。
当检测到 JTA 环境时, Spring 的JtaTransactionManager
用于管理事务。
自动配置的 JMS、DataSource 和 JPA bean 已升级以支持 XA 事务。
您可以使用标准的 Spring 惯用语,例如@Transactional
参与分布式事务。
如果您在 JTA 环境中,并且仍希望使用本地事务,则可以设置spring.jta.enabled
property 设置为false
以禁用 JTA 自动配置。
使用 Jakarta EE Managed Transaction Manager
如果您将 Spring Boot 应用程序打包为war
或ear
文件并将其部署到 Jakarta EE 应用服务器,则可以使用应用服务器的内置事务管理器。
Spring Boot 尝试通过查看常见的 JNDI 位置(java:comp/UserTransaction
,java:comp/TransactionManager
等)。
使用应用程序服务器提供的事务服务时,您通常还希望确保所有资源都由服务器管理并通过 JNDI 公开。
Spring Boot 尝试通过查找ConnectionFactory
在 JNDI 路径 (java:/JmsXA
或java:/XAConnectionFactory
),并且您可以使用spring.datasource.jndi-name
财产要配置DataSource
.
混合 XA 和非 XA JMS 连接
使用 JTA 时,主 JMSConnectionFactory
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?)
In some situations, you might want to process certain JMS messages by using a non-XA ConnectionFactory
.
For example, your JMS processing logic might take longer than the XA timeout.
If you want to use a non-XA ConnectionFactory
, you can the 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?)
For consistency, the jmsConnectionFactory
bean is also provided by using the bean alias 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?)
Supporting an Embedded Transaction Manager
The XAConnectionFactoryWrapper
and XADataSourceWrapper
interfaces can be used to support embedded transaction managers.
The interfaces are responsible for wrapping XAConnectionFactory
and XADataSource
beans and exposing them as regular ConnectionFactory
and DataSource
beans, which transparently enroll in the distributed transaction.
DataSource and JMS auto-configuration use JTA variants, provided you have a JtaTransactionManager
bean and appropriate XA wrapper beans registered within your ApplicationContext
.