分散式事務與 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 應用打包成 warear 檔案並部署到 Jakarta EE 應用伺服器,你可以使用應用伺服器內建的事務管理器。Spring Boot 會嘗試透過查詢常見的 JNDI 位置(java:comp/UserTransactionjava:comp/TransactionManager 等)來自動配置事務管理器。當使用應用伺服器提供的事務服務時,你通常也需要確保所有資源都由伺服器管理並透過 JNDI 暴露。Spring Boot 會透過在 JNDI 路徑(java:/JmsXAjava:/XAConnectionFactory)查詢 ConnectionFactory 來嘗試自動配置 JMS,並且你可以使用 spring.datasource.jndi-name 屬性來配置你的 DataSource

混合使用 XA 和非 XA JMS 連線

當使用 JTA 時,主要的 JMS ConnectionFactory Bean 是 XA 感知的,並參與分散式事務。你無需使用任何 @Qualifier 即可將其注入到你的 Bean 中

  • 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?)

支援嵌入式事務管理器

XAConnectionFactoryWrapperXADataSourceWrapper 介面可用於支援嵌入式事務管理器。這些介面負責包裝 XAConnectionFactoryXADataSource Bean,並將它們公開為常規的 ConnectionFactoryDataSource Bean,這些 Bean 會透明地參與分散式事務。如果你的 JtaTransactionManager Bean 和適當的 XA 包裝器 Bean 註冊在你的 ApplicationContext 中,DataSource 和 JMS 自動配置會使用 JTA 變體。