Java Spring批处理、XA和本地事务
可以在spring批处理中使用jobRepository来使用本地事务,但在分布式XA事务中执行特定的作业步骤 对于XA,我使用Atomicos 3.8.0。步骤应该读取JMS消息,并在处理后更新数据库 弹簧配置的相关部分:Java Spring批处理、XA和本地事务,java,spring,transactions,spring-batch,distributed-transactions,Java,Spring,Transactions,Spring Batch,Distributed Transactions,可以在spring批处理中使用jobRepository来使用本地事务,但在分布式XA事务中执行特定的作业步骤 对于XA,我使用Atomicos 3.8.0。步骤应该读取JMS消息,并在处理后更新数据库 弹簧配置的相关部分: <job id="job" xmlns="http://www.springframework.org/schema/batch"> <step id="inventorySync"> <tasklet transa
<job id="job" xmlns="http://www.springframework.org/schema/batch">
<step id="inventorySync">
<tasklet transaction-manager="xaTransactionManager">
<chunk reader="jmsQueueReader"
processor="messageProcessor"
writer="dbWriter"
reader-transactional-queue="true"/>
</tasklet>
</step>
</job>
<bean id="xaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"
lazy-init="true" depends-on="inventoryDataSource">
<constructor-arg name="transactionManager" ref="userTransactionManager"/>
<constructor-arg name="userTransaction" ref="userTransaction"/>
<property name="allowCustomIsolationLevels" value="true"/>
</bean>
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
<property name="dataSource" ref="batchJobsDataSource"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="databaseType" value="${batch.data.source.type}"/>
</bean>
<jdbc:embedded-database id="batchJobsDataSource" type="HSQL"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="batchJobsDataSource"/>
</bean>
在单元测试中成功使用Bitronix和生产中成功使用WebSphere JTA之前,我已经在所有3种资源中使用了XA事务。如果批处理数据库有一个独立于步骤其余部分的事务管理器,则在其中一个位置(批处理数据库或步骤)发生故障时,步骤和批处理数据库可能会“不同步”
例如,您可能在步骤(JMS和DB)上成功提交,然后在批处理数据库上失败。当您重新启动作业时,它会认为某个步骤不成功,而您的基本执行是失败的。在同一事务管理器中覆盖所有3个资源将防止出现这种情况。我理解2个管理器方法的缺点,但对于我的工作来说,重新启动后再次执行相同的步骤并不重要。