У меня есть пакетное задание пружины, состоящее из одного шага, который является шагом ниже. Он читает 100 файлов json, чтобы обработать их и сохранить их в базе данных по 25 блоков. Поскольку различные операторы вставки внутри блоков могут вызывать ConstraintViolationException, это можно легко решить, обрабатывая их один за другим. Вот почему я подумал об использовании 'faultTolerant' и skipLimit (также пробовал с повторной попыткой), надеясь, что при сбое фрагмента из 25 элементов он будет повторять их один за другим, чтобы найти неисправный и зафиксировать другие 24 DetailApplications. Однако, это не так. Это просто пропускает весь кусок 25 DetailApplications. Конечная статистика - 3 коммита, 100 операций чтения, 75 операций записи и 1 откат. Что я тут не так сделал? Или что я забыл?
Шаг:
return stepBuilderFactory.get("stepImportDetailsJob")
.<DataJson, DetailApplication> chunk(25)
.reader(detailApplicationReader)
.processor(detailApplicationProcessor)
.writer(detailApplicationWriter)
.faultTolerant()
.skipLimit(5)
.skip(Exception.class)
.build();
Метод записи:
@Override
public void write(List<? extends DetailApplication> list) {
detailApplicationRepository.saveAll(list);
}
Список всегда имеет размер 25 (размер чанка), хотя я ожидаю, что он будет равен 1 при «обнаружении» проблемы.