使用 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 嘗試透過在 JNDI 路徑(java:/JmsXA 或 java:/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?)
支援嵌入式事務管理器
XAConnectionFactoryWrapper 和 XADataSourceWrapper 介面可用於支援嵌入式事務管理器。這些介面負責包裝 XAConnectionFactory 和 XADataSource bean,並將它們公開為常規的 ConnectionFactory 和 DataSource bean,它們透明地參與分散式事務。DataSource 和 JMS 自動配置使用 JTA 變體,前提是你在 ApplicationContext 中註冊了 JtaTransactionManager bean 和適當的 XA 包裝器 bean。