Spring batch 弹簧批和JTA

Spring batch 弹簧批和JTA,spring-batch,jta,Spring Batch,Jta,我使用的是spring batch 2.1.9。此版本是否支持JTA事务?我有一个包含多个步骤的批处理作业定义。这些步骤中只有一个与工作单元中的多个数据源交互 是否可以将JtaTransactionManager应用于此步骤?我遇到以下异常,当SpringBatch尝试更新表中的元数据信息时,似乎会发生这种情况 由java.sql.SQLException引起 无法在分布式事务中调用Connection.commit。提交分布式事务时,事务管理器将提交资源管理器。。 我是否可以在Jta级别/

我使用的是spring batch 2.1.9。此版本是否支持JTA事务?我有一个包含多个步骤的批处理作业定义。这些步骤中只有一个与工作单元中的多个数据源交互

是否可以将JtaTransactionManager应用于此步骤?我遇到以下异常,当SpringBatch尝试更新表中的元数据信息时,似乎会发生这种情况


由java.sql.SQLException引起
无法在分布式事务中调用Connection.commit。提交分布式事务时,事务管理器将提交资源管理器。。

我是否可以在Jta级别/spring批处理设置任何属性来避免这种情况

如果不是步骤,如果我将JtaTxnMgr设置为作业级别,它会工作吗?我会避免这种情况,因为其他步骤不需要XA感知txn

org.springframework.batch.core.step.fatalstep执行异常: JobRepository失败,正在强制退出,状态未知 org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:441) 在 org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131) 在 org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:264) 在 org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInitation(StepContextRepeatCallback.java:76) 在 org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:367) 在 org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:214) 在 org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143) 在 org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:250) 在 org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195) 在 org.springframework.batch.core.partition.support.TaskExecutionPartitionHandler$1.call(TaskExecutionPartitionHandler.java:120) 在 org.springframework.batch.core.partition.support.TaskExecutionPartitionHandler$1.call(TaskExecutionPartitionHandler.java:118) 位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 在java.util.concurrent.FutureTask.run(FutureTask.java:138)中 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 在java.lang.Thread.run(Thread.java:619)处,由以下原因引起: org.springframework.transaction.TransactionSystemException:无法 提交JDBC事务;嵌套异常为java.sql.SQLException: 无法在分布式事务中调用Connection.commit。交易 管理器将在分发资源时提交资源管理器 事务已提交。在 org.springframework.jdbc.datasource.DataSourceTransactionManager.doCommit(DataSourceTransactionManager.java:271) 在 org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755) 在 org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724) 在 org.springframework.transaction.interceptor.TransactionSpectSupport.commitTransactionAfterReturning(TransactionSpectSupport.java:387) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172) 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 在$Proxy52.updateExecutionContext(未知源)处 org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:429) ... 由于java.sql.SQLException:无法调用 分布式事务中的Connection.commit。事务管理器 将在分布式事务启动时提交资源管理器 坚信的在 weblogic.jdbc.wrapper.JTSConnection.commit(JTSConnection.java:643)位于 org.springframework.jdbc.datasource.DataSourceTransactionManager.doCommit(DataSourceTransactionManager.java:268)


您可以在
tasklet
元素上指定事务管理器,允许您在一个步骤上使用一个事务管理器,在另一个步骤上使用其他事务管理器。请参见此处的第5.1.1节:

我已将JtaTxmManager设置为tasklet的此属性,但我遇到了上述异常。有工作测试用例吗?这是否意味着插入/更新到步骤_执行和其他元数据表参与jta事务?一个步骤只有一个事务,因此是的,期望元数据表参与该事务。否则,如果发生故障,您的业务数据和存储库之间的状态将不一致。JobRepository定义使用的是DataSourceTransactionManager,而as步骤定义使用的是JtaTransactionManager。这会是个问题吗?我们有多个重用JobRepository的作业(不需要JtaTxnManager)。