У меня есть Spring Batch Job, которые иногда работают дольше 2700 секунд. Когда они это делают, я замечаю исключение, которое исходит из весеннего пакета.TransactionSystemException при длительном запуске Spring Batch Jobs
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>
Похоже, подключение к базе данных поджимает.
Эта проблема всегда возникает, когда я совершаю опрос службы, которая занимает много времени.
Если есть какие-либо рекомендации или другие подходы, пожалуйста, дайте мне знать!
Также обратите внимание, что для рабочих мест, которые не работают очень долго < 2700 секунд, проблем нет.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Спасибо, Dave
Стек следы работы:
"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 со сном. Когда этот другой процесс завершается, работа завершается. Спасибо за любой вклад или предложения. –
Я нашел проблему. В моем шаге у меня была петля, которая ждала завершения задания. SpringBatch, по-видимому, не нравится, если время превышает определенный длительный период времени, например, 40 минут. Решение состояло в том, чтобы вернуть RepeatStatus.CONTINUABLE и снова вызвать. –