-1
我有一个弹簧批量作业,有时运行时间超过2700秒。当他们这样做时,我注意到来自Spring批处理框架的异常。长时间运行弹簧批量作业中的TransactionSystemException
springframework的版本:
<spring-batch.version>2.2.7.RELEASE</spring-batch.version>
<spring.framework.version>4.0.3.RELEASE</spring.framework.version>
这里是工作的定义:
<batch:job id="MyJob">
<batch:step id="trigger-job" next="poll-job">
<batch:tasklet ref="triggerJobStep" />
<batch:listeners>
<batch:listener ref="phaseStepListener" />
</batch:listeners>
</batch:step>
<batch:step id="poll-job">
<batch:tasklet ref="pollJobStatusStep" />
<batch:listeners>
<batch:listener ref="phaseStepListener" />
</batch:listeners>
</batch:step>
<batch:listeners>
<batch:listener ref="phaseCompletionListener" />
</batch:listeners>
</batch:job>
好像连接到数据库已经不多了。
这个问题总是发生在我轮询一个需要很长时间的服务时。
如果有任何建议或其他方法,请让我知道!
另外请注意,对于那些运行时间不长的工作,这是没有问题的。
如果您需要更多信息,请让我知道。
谢谢, 戴夫
工作的堆栈跟踪:45分钟后
"errorMessage":"Step requested termination: StepExecution: id=15365, version=2, name=poll-cmpaas-deploy, status=UNKNOWN, exitStatus=FAILED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=0, rollbackCount=1,
exitDescription=org.springframework.transaction.TransactionSystemException: Could not roll back JPA transaction; nested exception is javax.persistence.PersistenceException: unexpected error when rollbacking
at org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:546)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:849)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:826)
at org.springframework.transaction.support.TransactionTemplate.rollbackOnException(TransactionTemplate.java:164)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137)
at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:267)
at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77)
at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:253)
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195)
at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:141)
at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64)
at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60)
at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:151)
at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:130)
at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135)
at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:301)
at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:134)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.persistence.PersistenceException: unexpected error when rollbacking
at org.hibernate.jpa.internal.TransactionImpl.rollback(TransactionImpl.java:111)
at org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:542)
... 20 more
Caused by: org.hibernate.TransactionException: rollback failed
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:217)
at org.hibernate.jpa.internal.TransactionImpl.rollback(TransactionImpl.java:108)
... 21 more
Caused by: org.hibernate.TransactionException: unable to rollback against JDBC connection
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doRollback(JdbcTransaction.java:167)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:211)
... 22 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
at com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:5101)
at com.mchange.v2.c3p0.impl.NewProxyConnection.rollback(NewProxyConnection.java:860)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doRollback(JdbcTransaction.java:163)
... 23 more
Could not roll back JPA transaction; nested exception is javax.persistence.PersistenceException: unexpected error when rollbacking","warningMessage":null,"data":null}'
谢谢迈克尔,我觉得有一个数据库连接丢失的问题。这是我的问题。在我的工作中,我没有使用数据库。看来SpringBatch存在这个问题。那么其他人如何处理可能运行10-14小时的工作呢?我可以使用另一种策略吗?在我的工作中,我有一个监控另一个过程的步骤。这一步有一个睡眠while循环。当其他过程完成时,作业将退出。感谢您的任何意见或建议。 –
我发现了这个问题。在我的脚步里,我有一个等待工作完成的循环。如果时间超过40+分钟以上的某段时间,SpringBatch显然不会这样。解决方案是返回RepeatStatus.CONTINUABLE并再次调用。 –