Пакет Spring: почему транзакция откатывается, даже если я перехватил исключение
Я использую Spring Batch, и моя конфигурация шагов следующая:
@Bean
public Step testStep(
JdbcCursorItemReader<TestStep> testStageDataReader,
TestStepProcessor testStepProcessor,
CompositeItemWriter<Writer> testWriter,
PlatformTransactionManager transactionManager,
JobRepository jobRepository) {
return stepBuilderFactory
.get("TESTING")
.<>chunk(100)
.reader(testStageDataReader)
.processor(testStepProcessor)
.writer(testWriter)
.transactionManager(transactionManager)
.repository(jobRepository)
.build();
}
И в моем писателе:
void write(List<? extends TestEntity> items) {
try {
testRepository.saveAll(items);
} catch (Exception exp) {
log.error("Exception while writing the batch", Exp);
//If there is an exception try individual items and skip filed ones
items.forEach(eachTask -> {
try {
testRepository.save(eachTask);
} catch (Exception exp) {
logException(exp, eachTask.getId());
}
});
}
С кодом я ожидал, что если что-то пойдет не так с партией, я попробую отдельные элементы и пропущу неудачные.
Однако этого не происходит. Кажется, что транзакция потеряна и не восстанавливается.
1 ответ
С кодом я ожидал, что если что-то пойдет не так с партией, я попробую отдельные элементы и пропущу неудачные.
Ожидание неверное. Сканирование фрагментов запускается, когда от средства записи элементов генерируется исключение с возможностью пропуска. Судя по вашей конфигурации, это не так: вы не настроили какое-либо исключение с возможностью пропуска, и ваш писатель не генерирует его. Ваше определение шага должно быть примерно таким:
return stepBuilderFactory
.get("TESTING")
// other properties
.skip(MySkippableException.class)
.skipLimit(10)
.build()
И ваш писатель должен бросить MySkippableException
в какой-то момент.