【问题标题】:spring batch and JTA春季批次和JTA
【发布时间】:2014-10-13 21:40:31
【问题描述】:

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

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

Caused by java.sql.SQLException Cannot call Connection.commit in distributed transaction. Transaction Manager will commit the resource manager when the distributed transaction is committed..

我可以在 Jta 级别/弹簧批次设置任何属性来避免这种情况吗?

如果没有步骤,如果我在作业级别设置 JtaTxnMgr 会起作用吗?我会避免这种情况,因为其他步骤不需要是 XA-Aware txn。

org.springframework.batch.core.step.FatalStepExecutionException: 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.doInIteration(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.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:120) 在 org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.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。交易 Manager 将在分发时提交资源管理器 事务已提交。在 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.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:387) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 在 $Proxy52.updateExecutionContext(Unknown Source) 在 org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:429) ... 15 更多原因:java.sql.SQLException:无法调用 Connection.commit 在分布式事务中。事务管理器 当分布式事务完成时将提交资源管理器 坚定的。在 weblogic.jdbc.wrapper.JTSConnection.commit(JTSConnection.java:643) 在 org.springframework.jdbc.datasource.DataSourceTransactionManager.doCommit(DataSourceTransactionManager.java:268)

【问题讨论】:

    标签: spring-batch jta


    【解决方案1】:

    您可以在tasklet 元素上指定事务管理器,从而允许您在一个步骤中使用一个事务管理器,而在另一个步骤中使用其他事务管理器。请参阅此处的第 5.1.1 节:http://docs.spring.io/spring-batch/trunk/reference/html/configureStep.html

    【讨论】:

    • 我将 JtaTxmManager 设置为 tasklet 的这个属性,但我遇到了上面提到的异常。有工作的测试用例吗?这是否意味着对 step_execution 和其他元数据表的插入/更新参与 jta 事务?
    • 一个步骤只有一个事务,所以是的,期望元数据表参与该事务。否则,如果发生故障,您的业务数据和存储库之间的状态将不一致。
    • JobRepository 定义使用 DataSourceTransactionManager,而 Step 定义使用 JtaTransactionManager。这会是一个问题吗?我们有多个工作重用 JobRepository(不需要 JtaTxnManager)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2013-06-25
    • 2013-06-23
    • 1970-01-01
    相关资源
    最近更新 更多