JTA的分布式事务
Spring Boot通过使用Atomikos或Bitronix 嵌入式事务管理器支持跨多个XA资源的分布式JTA事务。部署到合适的Java EE Application Server时,也支持JTA事务。
检测到JTA环境时,Spring JtaTransactionManager
用于管理事务。自动配置的JMS,DataSource和JPA bean已升级为支持XA事务。您可以使用标准的Spring惯用语,例如@Transactional
,参与分布式事务。如果您在JTA环境中并仍希望使用本地事务,则可以将该spring.jta.enabled
属性设置false
为禁用JTA自动配置。
使用Atomikos事务管理器
Atomikos是一个流行的开源事务管理器,可以嵌入到Spring Boot应用程序中。您可以使用 spring-boot-starter-jta-atomikos
Starter引入相应的Atomikos库。Spring Boot自动配置Atomikos并确保将适当的depends-on
设置应用于Spring bean以正确启动和关闭顺序。
默认情况下,Atomikos事务日志将写入transaction-logs
应用程序主目录(应用程序jar文件所在的目录)中的目录。您可以通过spring.jta.log-dir
在application.properties
文件中设置属性来自定义此目录的位置 。以…开头的属性spring.jta.atomikos.properties
也可用于自定义AtomikosUserTransactionServiceImp
。有关 完整的详细信息,请参阅 AtomikosProperties
Javadoc。
为确保多个事务管理器可以安全地协调相同的资源管理器,必须使用唯一ID配置每个Atomikos实例。默认情况下,此ID是运行Atomikos的计算机的IP地址。要确保生产中的唯一性,应
spring.jta.transaction-manager-id
为应用程序的每个实例配置具有不同值的属性。
使用Bitronix事务管理器
Bitronix是一种流行的开源JTA事务管理器实现。您可以使用spring-boot-starter-jta-bitronix
starter将适当的Bitronix依赖项添加到项目中。与Atomikos一样,Spring Boot会自动配置Bitronix并对bean进行后处理,以确保启动和关闭顺序正确。
默认情况下,Bitronix事务日志文件(part1.btm
和part2.btm
)将写入transaction-logs
应用程序主目录中的目录。您可以通过设置spring.jta.log-dir
属性来自定义此目录的位置。以…开头的属性spring.jta.bitronix.properties
也绑定到 bitronix.tm.Configuration
bean,允许完全自定义。有关详细信息,请参阅 Bitronix文档。
为确保多个事务管理器可以安全地协调相同的资源管理器,必须为每个Bitronix实例配置唯一ID。默认情况下,此ID是运行Bitronix的计算机的IP地址。要确保生产中的唯一性,应
spring.jta.transaction-manager-id
为应用程序的每个实例配置具有不同值的属性。
使用Java EE托管事务管理器
如果将Spring Boot应用程序打包为一个war
或一个ear
文件并将其部署到Java EE应用程序服务器,则可以使用应用程序服务器的内置事务管理器。Spring Boot尝试通过查看常见的JNDI位置(java:comp/UserTransaction
,java:comp/TransactionManager
等等)来自动配置事务管理器。如果使用应用程序服务器提供的事务服务,通常还需要确保所有资源都由服务器管理并通过JNDI公开。Spring Boot尝试通过查找ConnectionFactory
JNDI路径(java:/JmsXA
或java:/XAConnectionFactory
)来自动配置JMS ,您可以使用该 spring.datasource.jndi-name
属性 来配置您的DataSource
。
混合XA和非XA JMS连接
使用JTA时,主JMS ConnectionFactory
bean可识别XA并参与分布式事务。在某些情况下,您可能希望使用非XA处理某些JMS消息ConnectionFactory
。例如,您的JMS处理逻辑可能需要比XA超时更长的时间。
如果要使用非XA ConnectionFactory
,可以注入 nonXaJmsConnectionFactory
bean而不是@Primary
jmsConnectionFactory
bean。为了保持一致性,jmsConnectionFactory
还使用bean别名提供bean xaJmsConnectionFactory
。
以下示例显示了如何注入ConnectionFactory
实例:
1 | //注入主(XA感知)ConnectionFactory |
支持替代嵌入式事务管理器
该XAConnectionFactoryWrapper
和XADataSourceWrapper
接口可用于支持替代嵌入式事务经理。接口负责包装XAConnectionFactory
和XADataSource
bean,并将它们作为常规ConnectionFactory
和DataSource
bean 公开,它们透明地注册到分布式事务中。DataSource和JMS自动配置使用JTA变体,前提是您有一个JtaTransactionManager
bean和在您的域中注册的相应XA包装bean ApplicationContext
。
该BitronixXAConnectionFactoryWrapper 和BitronixXADataSourceWrapper 提供了如何编写XA包装很好的例子。