Spring batch 长时间运行的Spring批处理作业中的TransactionSystemException

Spring batch 长时间运行的Spring批处理作业中的TransactionSystemException,spring-batch,jobs,rollback,Spring Batch,Jobs,Rollback,我有一个Spring批处理作业,有时运行时间超过2700秒。当他们这样做时,我注意到一个来自spring批处理框架的异常 SpringFramework版本: <spring-batch.version>2.2.7.RELEASE</spring-batch.version> <spring.framework.version>4.0.3.RELEASE</spring.framework.version> 您的数据库连接在45分钟后被切断。要么

我有一个Spring批处理作业,有时运行时间超过2700秒。当他们这样做时,我注意到一个来自spring批处理框架的异常

SpringFramework版本:

<spring-batch.version>2.2.7.RELEASE</spring-batch.version>
<spring.framework.version>4.0.3.RELEASE</spring.framework.version>

您的数据库连接在45分钟后被切断。要么是你的服务器正在杀死它,要么更可能是你的应用程序和数据库之间有一个防火墙正在杀死持久性连接,而长时间打开的防火墙通常会切断持久性连接,不管它们在一段时间后是否在使用。假设是防火墙,您需要将其配置为不切断连接。

谢谢Michael,我发现数据库连接断开时出现了问题。这是我的问题。在我的工作中,我并不完全使用数据库。看来SpringBatch遇到了这个问题。那么,其他人如何处理可能运行10-14小时的工作呢?我还有别的策略可以用吗?在我的工作中,我有一个步骤是监视另一个过程。此步骤有一个带睡眠的while循环。当另一个进程完成时,作业将退出。谢谢你的意见。我发现了这个问题。在我的步骤中,我有一个循环在等待作业完成。如果时间超过某个较长的时间段(如40分钟以上),SpringBatch显然不喜欢这样。解决方案是返回RepeatStatus.CONTINUABLE并再次调用。
<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>
"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}'