春季批次和JTA

时间:2014-08-20 13:40:19

标签: spring-batch jta

我正在使用春季批次2.1.9。此版本是否支持JTA交易?我有一个批处理作业定义,它有多个步骤。这些步骤中只有一个与工作单元中的多个数据源交互。

是否可以将JtaTransactionManager应用于此步骤?我得到以下异常,当spring批量尝试更新表中的元数据信息时,看起来会发生这种情况。

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)     at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:303)     在java.util.concurrent.FutureTask.run(FutureTask.java:138)at   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(未知来源)at   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)at at   org.springframework.jdbc.datasource.DataSourceTransactionManager.doCommit(DataSourceTransactionManager.java:268)

1 个答案:

答案 0 :(得分:1)

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