Spring Batch: пропустить запись, которая не может быть записана в базу данных, и перейти к следующей записи - PullRequest
1 голос
/ 08 ноября 2019

Учитывая задание Spring Batch , которое использует чан-ориентированную обработку для чтения данных из файла, выполнения некоторой обработки данных и записи преобразованных записей в базу данных, есть ли способ пропустить запись вЕсть ли исключение при записи в базу данных и переходе к следующей записи? (Какой-то перехватчик?)

Кроме того, как я понимаю, когда запись в данном чанке не может быть записана (например, значение больше, чем длина столбца базы данных), весь чанк потерпит неудачу. Я хочу передать эту запись некоторому перехватчику, который затем может попытаться исправить проблему, исправив значение или записав запись ошибки в некоторый файл журнала, и перейти к следующей записи, а не к неудаче пакета. Мне известно, что Spring Batch предоставляет некоторые встроенные прослушиватели, которые запускаются при исключении, но я не могу понять, как использовать их для выполнения того, что я хочу.

Как добиться выполнения этого требования в SpringBatch

1 Ответ

0 голосов
/ 08 ноября 2019

есть ли способ пропустить запись в случае возникновения исключения при записи в базу данных и перейти к следующей записи?

Используя отказоустойчивый шаг, вы можете настроить SkipPolicy . Вот пример:

@Bean
public Step step1() {
   return this.stepBuilderFactory.get("step1")
            .<String, String>chunk(10)
            .reader(flatFileItemReader())
            .writer(itemWriter())
            .faultTolerant()
            .skipLimit(10)
            .skip(FlatFileParseException.class)
            .build();
}

В этом примере, когда происходит FlatFileParseException, соответствующий элемент будет пропущен. Вы можете найти более подробную информацию в разделе Настройка пропуска логики справочной документации.

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

Вы можете получать уведомления о пропущенных элементах, зарегистрировав SkipListener . Это правильное место для записи пропущенных элементов в файл, например.

и переход к следующей записи, а не сбой пакета

Когда выдается пропускаемое исключениево время операции записи Spring Batch будет сканировать чанк на предмет неисправного элемента (поскольку он не может знать, какой элемент вызвал ошибку). Технически Spring Batch установит размер чанка равным 1 и будет использовать одну транзакцию на элемент, поэтому откат будет выполняться только для неисправного элемента. Это позволяет вам выполнить вышеуказанное требование. Вы можете найти пример кода здесь .

...