2011-12-15 3 views
0

Кажется, что Spring Batch работает в той же транзакции, что и ejbs. Поэтому, когда мы получаем откат в ejbs, Spring Batch не может обновить свое состояние в базе данных.Spring Batch не обновляет свое состояние из-за RollbackException

Исключение мы получаем:

org.springframework.batch.core.step.FatalStepExecutionException: JobRepository failure forcing exit with unknown status 
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:418) 
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130) 
    at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:262) 
    at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:76) 
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:367) 
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:214) 
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143) 
    at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:248) 
    at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195) 
    at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:135) 
    at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:61) 
    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:144) 
    at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:124) 
    at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135) 
    at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:281) 
    at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:120) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Error in allocating a connection. Cause: javax.transaction.RollbackException 

Как мы можем убедиться, что Spring Batch может обновлять свое состояние, даже когда шаг потерпит неудачу? Это ошибка в Spring Batch, или мы сделали что-то неправильно?

ответ

-2

Похоже, проблема была в нашей конфигурации joblaunchers.

У нас есть некоторые процессы, запускающие другие процессы, и когда они использовали один и тот же экземпляр экземпляра задачи, откат откатывал сама задача.

Не 100% уверен, что если бы это было то, что исправили ошибку, но теперь он работает :-)

-1

Является ли партия также запущенной внутри ejb? Какова настройка транзакции для ejbs? BMT или CMT? Откуда вы в своей партии используете EJB? Читатель, Процессор, Писатель? Слушатель? Вы пытаетесь обработать исключение, которое вызывает откат ejb через регулярный catch (исключение e) в вашем коде, пропустить или повторить попытку?

+0

Похоже, у нас были некоторые остановлены процессы в конце концов. Мы призываем ejbs в писателе. Нет, мы не справляемся со всеми исключениями. Мы даем им потерпеть неудачу, и после этого у нас есть другой процесс, перезагружающий их через некоторое время. – olemartin

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

  • Нет связанных вопросов^_^