Пропуск исключений Spring Batch не работает должным образом - PullRequest
0 голосов
/ 26 июня 2019

У меня есть пакетное задание пружины, состоящее из одного шага, который является шагом ниже. Он читает 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 при «обнаружении» проблемы.

1 Ответ

0 голосов
/ 29 июня 2019

Я смог заставить его работать, используя этот ответ .Все, что мне нужно было сделать, чтобы исправить проблему, это очистить entityManager после сохранения.Мой метод записи теперь выглядит так:

@Override
public void write(List<? extends DetailApplication> list) {
    detailApplicationRepository.saveAll(list);
    entityManager.flush();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...