分散式事務與 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 感知的,並參與分散式事務。你無需使用任何 @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?)
支援嵌入式事務管理器
XAConnectionFactoryWrapper
和 XADataSourceWrapper
介面可用於支援嵌入式事務管理器。這些介面負責包裝 XAConnectionFactory
和 XADataSource
Bean,並將它們公開為常規的 ConnectionFactory
和 DataSource
Bean,這些 Bean 會透明地參與分散式事務。如果你的 JtaTransactionManager
Bean 和適當的 XA 包裝器 Bean 註冊在你的 ApplicationContext
中,DataSource 和 JMS 自動配置會使用 JTA 變體。