使用 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 應用程式封裝為 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
beans,並將它們公開為常規的 ConnectionFactory
和 DataSource
beans,它們會透明地註冊到分散式交易中。DataSource 和 JMS 自動組態使用 JTA 變體,前提是您在您的 ApplicationContext
中註冊了 JtaTransactionManager
bean 和適當的 XA 包裝器 beans。