|
对于最新的稳定版本,请使用 Spring Boot 3.5.5! |
使用 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 尝试通过查找ConnectionFactory在 JNDI 路径 (java:/JmsXA或java:/XAConnectionFactory),并且您可以使用spring.datasource.jndi-name属性配置您的DataSource.
混合 XA 和非 XA JMS 连接
使用 JTA 时,主要 JMSConnectionFactorybean 是 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 来处理某些 JMS 消息ConnectionFactory.
例如,您的 JMS 处理逻辑可能需要比 XA 超时更长的时间。
如果要使用非 XAConnectionFactory,您可以nonXaJmsConnectionFactory豆:
-
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?)
为了保持一致性,该jmsConnectionFactoryBean 也通过使用 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豆子并将它们公开为常规ConnectionFactory和DataSourcebean,它透明地注册到分布式事务中。
DataSource 和 JMS 自动配置使用 JTA 变体,前提是您有JtaTransactionManagerbean 和适当的 XA 包装器 bean 在您的ApplicationContext.