Spring Batch - как выполнить задание, если ItemReader не возвращает данные - PullRequest
1 голос
/ 07 апреля 2011

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

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

Привет

Ответы [ 4 ]

3 голосов
/ 01 марта 2012

из 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 голос
/ 19 марта 2013

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

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

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

0 голосов
/ 11 апреля 2011

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

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

0 голосов
/ 07 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...