JTA的分布式事务

Spring Boot通过使用AtomikosBitronix 嵌入式事务管理器支持跨多个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-atomikosStarter引入相应的Atomikos库。Spring Boot自动配置Atomikos并确保将适当的depends-on设置应用于Spring bean以正确启动和关闭顺序。

默认情况下,Atomikos事务日志将写入transaction-logs应用程序主目录(应用程序jar文件所在的目录)中的目录。您可以通过spring.jta.log-dirapplication.properties文件中设置属性来自定义此目录的位置 。以…开头的属性spring.jta.atomikos.properties也可用于自定义AtomikosUserTransactionServiceImp。有关 完整的详细信息,请参阅 AtomikosPropertiesJavadoc

为确保多个事务管理器可以安全地协调相同的资源管理器,必须使用唯一ID配置每个Atomikos实例。默认情况下,此ID是运行Atomikos的计算机的IP地址。要确保生产中的唯一性,应spring.jta.transaction-manager-id 为应用程序的每个实例配置具有不同值的属性。

使用Bitronix事务管理器

Bitronix是一种流行的开源JTA事务管理器实现。您可以使用spring-boot-starter-jta-bitronixstarter将适当的Bitronix依赖项添加到项目中。与Atomikos一样,Spring Boot会自动配置Bitronix并对bean进行后处理,以确保启动和关闭顺序正确。

默认情况下,Bitronix事务日志文件(part1.btmpart2.btm)将写入transaction-logs应用程序主目录中的目录。您可以通过设置spring.jta.log-dir属性来自定义此目录的位置。以…开头的属性spring.jta.bitronix.properties也绑定到 bitronix.tm.Configurationbean,允许完全自定义。有关详细信息,请参阅 Bitronix文档

为确保多个事务管理器可以安全地协调相同的资源管理器,必须为每个Bitronix实例配置唯一ID。默认情况下,此ID是运行Bitronix的计算机的IP地址。要确保生产中的唯一性,应spring.jta.transaction-manager-id 为应用程序的每个实例配置具有不同值的属性。

使用Java EE托管事务管理器

如果将Spring Boot应用程序打包为一个war或一个ear文件并将其部署到Java EE应用程序服务器,则可以使用应用程序服务器的内置事务管理器。Spring Boot尝试通过查看常见的JNDI位置(java:comp/UserTransactionjava:comp/TransactionManager等等)来自动配置事务管理器。如果使用应用程序服务器提供的事务服务,通常还需要确保所有资源都由服务器管理并通过JNDI公开。Spring Boot尝试通过查找ConnectionFactoryJNDI路径(java:/JmsXAjava:/XAConnectionFactory)来自动配置JMS ,您可以使用该 spring.datasource.jndi-name属性 来配置您的DataSource

混合XA和非XA JMS连接

使用JTA时,主JMS ConnectionFactorybean可识别XA并参与分布式事务。在某些情况下,您可能希望使用非XA处理某些JMS消息ConnectionFactory。例如,您的JMS处理逻辑可能需要比XA超时更长的时间。

如果要使用非XA ConnectionFactory,可以注入 nonXaJmsConnectionFactorybean而不是@Primary jmsConnectionFactorybean。为了保持一致性,jmsConnectionFactory还使用bean别名提供bean xaJmsConnectionFactory

以下示例显示了如何注入ConnectionFactory实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
//注入主(XA感知)ConnectionFactory
@Autowired
private ConnectionFactory defaultConnectionFactory;

//注入XA感知ConnectionFactory(使用别名并注入与上面相同的内容)
@Autowired
@Qualifier("xaJmsConnectionFactory")
private ConnectionFactory xaConnectionFactory;

//注入非XA感知的ConnectionFactory
@Autowired
@Qualifier("nonXaJmsConnectionFactory")
private ConnectionFactory nonXaConnectionFactory;

支持替代嵌入式事务管理器

XAConnectionFactoryWrapperXADataSourceWrapper接口可用于支持替代嵌入式事务经理。接口负责包装XAConnectionFactoryXADataSourcebean,并将它们作为常规ConnectionFactoryDataSourcebean 公开,它们透明地注册到分布式事务中。DataSource和JMS自动配置使用JTA变体,前提是您有一个JtaTransactionManagerbean和在您的域中注册的相应XA包装bean ApplicationContext

BitronixXAConnectionFactoryWrapperBitronixXADataSourceWrapper 提供了如何编写XA包装很好的例子。