使用 JTA 的分散式交易

Spring Boot 透過使用從 JNDI 檢索的事務管理器,支援跨多個 XA 資源的分散式 JTA 交易。

當偵測到 JTA 環境時,Spring 的 JtaTransactionManager 會用於管理交易。自動組態的 JMS、DataSource 和 JPA beans 會升級以支援 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 感知的,並參與分散式交易。您可以將其注入到您的 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?)

支援嵌入式事務管理器

XAConnectionFactoryWrapperXADataSourceWrapper 介面可用於支援嵌入式事務管理器。這些介面負責包裝 XAConnectionFactoryXADataSource beans,並將它們公開為常規的 ConnectionFactoryDataSource beans,它們會透明地註冊到分散式交易中。DataSource 和 JMS 自動組態使用 JTA 變體,前提是您在您的 ApplicationContext 中註冊了 JtaTransactionManager bean 和適當的 XA 包裝器 beans。