Spring Boot 參考指南(使用JTA分佈式事務)

37. 用JTA分佈式事務

經過使用AtomikosBitronix嵌入式事務管理器,Spring Boot支持跨多個XA資源的分佈式JTA事務,在部署到合適的Java EE應用服務器時也支持JTA事務。html

當檢測到JTA環境時,使用Spring的JtaTransactionManager來管理事務,自動配置的JMS、數據源和JPA bean被升級爲支持XA事務,你可使用標準的Spring風格,例如@Transactional,來參與分佈式事務。若是你在JTA環境中,而且仍然但願使用本地事務,你能夠設置spring.jta.enabled屬性爲false以禁用JTA自動配置。java

37.1 使用Atomikos事務管理器

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屬性的不一樣值。

37.2 使用Bitronix事務管理器

Bitronix是一個流行的開源JTA事務管理器實現,你可使用spring-boot-starter-jta-bitronix啓動器向項目添加適當的Bitronix依賴項,與Atomikos同樣,Spring Boot能夠自動配置Bitronix並對bean進行後處理,以確保啓動和關閉順序是正確的。spring

默認狀況下,Bitronix事務日誌文件(part1.btmpart2.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 Javadocapi

37.4 使用Java EE Managed事務管理器

若是將Spring Boot應用程序打包爲warear文件並將其部署到Java EE應用服務器,則可使用應用服務器的內置事務管理器。Spring Boot試圖經過查看常見的JNDI位置(java:comp/UserTransaction, java:comp/TransactionManager,等等)自動配置事務管理器,若是你使用由應用服務器提供的事務服務,你一般還但願確保全部資源都由服務器管理,並經過JNDI公開。Spring Boot試圖經過在JNDI路徑(java:/JmsXAjava:/XAConnectionFactory)查找ConnectionFactory來自動配置JMS,你可使用spring.datasource.jndi-name屬性來配置DataSource安全

37.5 混合XA和非XA JMS鏈接

在使用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;

37.6 支持供選擇的嵌入式事務管理器

可使用XAConnectionFactoryWrapperXADataSourceWrapper接口來支持供選擇的嵌入式事務管理器,接口負責封裝XAConnectionFactoryXADataSource bean,並將它們公開爲常規的ConnectionFactoryDataSource bean,它們透明地註冊到分佈式事務中。數據源和JMS自動配置使用JTA變體,前提是你有一個JtaTransactionManager bean和在你的ApplicationContext中註冊的適當的XA包裝器bean。

BitronixXAConnectionFactoryWrapperBitronixXADataSourceWrapper提供瞭如何編寫XA包裝器的好例子。


上一篇:驗證&發送電子郵件

下一篇:Hazelcast

相關文章
相關標籤/搜索