經過使用Atomikos或Bitronix嵌入式事務管理器,Spring Boot支持跨多個XA資源的分佈式JTA事務,在部署到合適的Java EE應用服務器時也支持JTA事務。html
當檢測到JTA環境時,使用Spring的JtaTransactionManager
來管理事務,自動配置的JMS、數據源和JPA bean被升級爲支持XA事務,你可使用標準的Spring風格,例如@Transactional
,來參與分佈式事務。若是你在JTA環境中,而且仍然但願使用本地事務,你能夠設置spring.jta.enabled
屬性爲false
以禁用JTA自動配置。java
Atomikos是一種流行的開源事務管理器,能夠嵌入到Spring Boot應用程序中,你可使用spring-boot-starter-jta-atomikos
啓動器來拉取適當的Atomikos庫,Spring Boot能夠自動配置Atomikos,並確保將適當的依賴設置應用到你的Spring bean中,以實現正確的啓動和關閉順序。git
默認狀況下,Atomikos事務日誌被寫入應用程序的主目錄中的transaction-logs
目錄(應用程序jar文件所在的目錄),你能夠經過在application.properties
文件中設置spring.jta.log-dir
來定製這個目錄的位置,從spring.jta.atomikos.properties
開始的屬性還能夠用於定製Atomikos UserTransactionServiceImp
,請參閱AtomikosProperties Javadoc獲取完整的詳細信息。github
爲了確保多個事務管理器能夠安全地協調相同的資源管理器,每一個Atomikos實例必須配置惟一的ID,默認狀況下,這個ID是Atomikos運行的機器的IP地址。爲了確保生產中具備惟一性,你應該爲應用程序的每一個實例配置
spring.jta.transaction-manager-id
屬性的不一樣值。
Bitronix是一個流行的開源JTA事務管理器實現,你可使用spring-boot-starter-jta-bitronix
啓動器向項目添加適當的Bitronix依賴項,與Atomikos同樣,Spring Boot能夠自動配置Bitronix並對bean進行後處理,以確保啓動和關閉順序是正確的。spring
默認狀況下,Bitronix事務日誌文件(part1.btm
和part2.btm
)被寫入到應用程序主目錄中的transaction-logs
目錄中,你能夠經過設置spring.jta.log-dir
屬性來定製這個目錄的位置。從spring.jta.bitronix.properties
開始的屬性也綁定到bitronix.tm.Configuration
bean,容許進行徹底定製,詳細信息請參閱Bitronix文檔。sql
37.3 使用Narayana事務管理器
Narayana是JBoss支持的一個流行的開源JTA事務管理器實現,你可使用spring-boot-starter-jta-narayana
啓動器向項目添加適當的Narayana依賴項,與Atomikos和Bitronix同樣,Spring Boot將自動配置Narayana並對bean進行後處理,以確保啓動和關閉順序是正確的。segmentfault
默認狀況下,Narayana事務日誌被寫到應用程序主目錄中的transaction-logs
目錄(應用程序jar文件所在的目錄),你能夠在application.properties
文件經過設置spring.jta.log-dir
屬性來定製這個目錄的位置,從spring.jta.narayana.properties
開始的屬性也能夠用來定製narayana配置,有關詳細信息,請參閱NarayanaProperties Javadoc。api
若是將Spring Boot應用程序打包爲war
或ear
文件並將其部署到Java 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
。安全
在使用JTA時,主要的JMS ConnectionFactory
bean是支持xa的,並參與分佈式事務,在某些狀況下,你可能但願經過使用非XA ConnectionFactory
來處理某些JMS消息,例如,你的JMS處理邏輯可能須要比XA超時更長的時間。服務器
若是但願使用非XA ConnectionFactory
,能夠注入nonXaJmsConnectionFactory
bean而不是@Primary
jmsConnectionFactory
bean,爲了保持一致性,jmsConnectionFactory
bean也經過使用bean別名xaJmsConnectionFactory
提供。
下面的示例演示如何注入ConnectionFactory
實例:
// Inject the primary (XA aware) ConnectionFactory @Autowired private ConnectionFactory defaultConnectionFactory; // Inject the XA aware ConnectionFactory (uses the alias and injects the same as above) @Autowired @Qualifier("xaJmsConnectionFactory") private ConnectionFactory xaConnectionFactory; // Inject the non-XA aware ConnectionFactory @Autowired @Qualifier("nonXaJmsConnectionFactory") private ConnectionFactory nonXaConnectionFactory;
可使用XAConnectionFactoryWrapper和XADataSourceWrapper接口來支持供選擇的嵌入式事務管理器,接口負責封裝XAConnectionFactory
和XADataSource
bean,並將它們公開爲常規的ConnectionFactory
和DataSource
bean,它們透明地註冊到分佈式事務中。數據源和JMS自動配置使用JTA變體,前提是你有一個JtaTransactionManager
bean和在你的ApplicationContext
中註冊的適當的XA包裝器bean。
BitronixXAConnectionFactoryWrapper和BitronixXADataSourceWrapper提供瞭如何編寫XA包裝器的好例子。