2015-04-30 3 views
-1

У меня есть 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}' 

ответ

0

Ваше подключение к базе данных в настоящее время оторванные через 45 минут. Либо ваш сервер убивает его, либо (более вероятно) у вас есть межсетевой экран между вашим приложением и базой данных, которая убивает постоянные соединения, которые открываются долго (брандмауэры обычно сокращают постоянные соединения, независимо от того, используются ли они через определенный период времени). Предполагая, что это брандмауэр, вам нужно настроить это, чтобы не отключить ваше соединение.

+0

Спасибо, Майкл, я понял, что возникла проблема с удалением базы данных. Вот моя проблема. В моей работе я не использую базу данных как все. Похоже, что проблема SpringBatch возникает. Так как другие люди справляются с работами, которые потенциально могут работать в течение 10-14 часов? Есть ли другая стратегия, которую я могу использовать? В моей работе у меня есть шаг, который контролирует другой процесс. Этот шаг имеет цикл while со сном. Когда этот другой процесс завершается, работа завершается. Спасибо за любой вклад или предложения. –

+0

Я нашел проблему. В моем шаге у меня была петля, которая ждала завершения задания. SpringBatch, по-видимому, не нравится, если время превышает определенный длительный период времени, например, 40 минут. Решение состояло в том, чтобы вернуть RepeatStatus.CONTINUABLE и снова вызвать. –

Смежные вопросы