На одном из этапов моего задания Spring Batch я пытаюсь настроить его так, чтобы при наступлении ObjectOptimisticLockingFailureException
этот шаг можно было повторить, и, надеюсь, повторная попытка сработает.
@Bean
public Step myStep(StaxEventItemReader<Response> staxEventResponseReader,
ItemWriter<Response> itemWriter,
ItemProcessor<? super Response, ? extends Response> responseProcessor) {
return stepBuilderFactory.get("myStep")
.<Response, Response>chunk(1)
.reader(staxEventResponseReader)
.processor(responseProcessor)
.writer(itemWriter)
//.faultTolerant().retryLimit(3).retry(Exception.class)
.build();
}
Логика c модуля записи для этого шага довольно проста: он пытается прочитать строку из базы данных и, как только находит строку, обновляет ее. Я смог воспроизвести ObjectOptimisticLockingFailureException
, установив точку останова сразу после метода поиска, вручную поднял столбец version
для строки в базе данных и зафиксировал ее, а затем возобновил.
Однако после раскомментирования повторной попытки определение в моем шаге, попытки не были предприняты. После некоторой отладки кажется, что Spring retry logi c находится внутри транзакции чанка; но, поскольку ObjectOptimisticLockingFailureException
не генерируется моим кодом в модуле записи, а из-за транзакции фрагмента Spring, фиксирующей logi c, попытки вообще не предпринимались.
Chunk Transaction Begin
Begin Retry loop in FaultTolerantChunkProcessor.write()
Writer logic in my Step
End Retry loop
Chunk Transaction Commit - Throws ObjectOptimisticLockingFailureException
Когда я пытался явно выбросить ObjectOptimisticLockingFailureException
в моем писателе лог повторов c работал отлично, как и ожидалось. Мои вопросы:
- Как заставить работать лог повторов c, если исключение не генерируется из кода моего модуля записи на шаге, но к тому времени, когда транзакция порции фиксируется Spring Batch?
- Другое странное поведение заключается в том, что, когда я вручную вызываю
ObjectOptimisticLockingFailureException
, поднимая столбец версии в базе данных, с определением повторения, прокомментированным в шаге, конечный статус шага НЕУДАЧЕН, что ожидается. Но если определение повторной попытки не закомментировано, окончательный статус шага ЗАВЕРШЕН. Почему это?