使用 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 感知的,並參與分散式事務。你可以將它注入到你的 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 bean,並將它們公開為常規的 ConnectionFactoryDataSource bean,它們透明地參與分散式事務。DataSource 和 JMS 自動配置使用 JTA 變體,前提是你在 ApplicationContext 中註冊了 JtaTransactionManager bean 和適當的 XA 包裝器 bean。

© . This site is unofficial and not affiliated with VMware.