Пакет Spring — как выполнить задание с ошибкой, если программа чтения элементов не возвращает данных

#spring #spring-batch

#spring #пакет spring-batch

Вопрос:

У меня есть пакетное приложение spring, которое считывает данные из таблицы базы данных с помощью JdbcCursorItemReader и записывает их в плоский файл с помощью FlatFileItemWriter.

Когда я тестирую свое приложение, я вижу, что FlatFileItemWriter создает файл, даже если данные не возвращаются из базы данных через JdbcCursorItemReader. Однако я планирую выполнить задание с ошибкой, если в базе данных нет подходящих данных. Возможно ли это сделать или, по крайней мере, запретить FlatFileItemWriter создавать файл?

С уважением

Ответ №1:

из http://static.springsource.org/spring-batch/reference/html/patterns.html

11.7. Обработка завершения этапа, когда входные данные не найдены

Во многих пакетных сценариях отсутствие строк в базе данных или файле для обработки не является исключением. Считается, что шаг просто не нашел работы и завершается чтением 0 элементов. Все реализации ItemReader, предоставляемые «из коробки» в Spring Batch, по умолчанию используют этот подход. Это может привести к некоторой путанице, если ничего не записывается, даже когда входные данные присутствуют. (что обычно происходит, если файл был неправильно назван и т.д.) По этой причине следует проверить сами метаданные, чтобы определить, какой объем работы, по мнению фреймворка, требуется обработать. Однако что, если отсутствие входных данных считается исключительным? В этом случае лучшим решением является программная проверка метаданных на предмет отсутствия обработанных элементов и возникновения сбоя. Поскольку это распространенный вариант использования, прослушивателю предоставляется только эта функциональность:

 public class NoWorkFoundStepExecutionListener extends StepExecutionListenerSupport {

public ExitStatus afterStep(StepExecution stepExecution) {
    if (stepExecution.getReadCount() == 0) {
        return ExitStatus.FAILED;
    }
    return null;
}

}
  

Комментарии:

1. Все реализации ItemReader, предоставляемые «из коробки» в Spring Batch, по умолчанию соответствуют этому подходу , который я использую JdbcPagingItemReader , и он помечает задание как неудачное, если у reader нет ни одной строки для начала. Я что-то упускаю?

2. Я также добавил прослушиватель, как описано в вашем ответе, и зарегистрировался в step, но задание по-прежнему помечено как неудачное. Для моего сценария отсутствие строк является допустимой ситуацией.

3. @SabirKhan Я так не думаю, я использую JdbcCursorItemReader и не получаю никаких исключений, когда нет данных для чтения.

Ответ №2:

Возможно ли это сделать или, по крайней мере, запретить FlatFileItemWriter создавать файл?

Что касается второй части вашего вопроса, у FlatFileItemWriter есть флаг для удаления файла, если ничего не записано.

shouldDeleteIfEmpty : Флаг, указывающий, что целевой файл должен быть удален, если при закрытии не было записано ни одной строки (кроме верхнего и нижнего колонтитулов).

Ответ №3:

Метод afterRead ItemReadListener будет вызван, даже если данных нет. Вероятно, вы можете поместить туда то, что хотели.

Ответ №4:

ItemProcessor будет вызван только в том случае, если средство чтения элементов возвращает объект. Значение Null используется для указания на завершение обработки.

Не используйте значение null в качестве индикатора ошибки: его цель — завершить обработку. Вам лучше использовать исключение для ваших ошибок.