Пакет 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 в какой-то момент.

Другие вопросы по тегам