#spring #spring-batch
#весна #весенний замес
Вопрос:
У меня есть требование в Spring Batch, имя файла будет передано в качестве входных данных через аргументы, если файл присутствует, нам нужно прочитать файл порциями по 1000 или, если имя файла не передано, тогда необходимо подключиться к базе данных oracle и прочитать все записи из определенной таблицы
Я просмотрел документацию, но не уверен, как это реализовать
Примечание: файл будет содержать только идентификатор, обогащение будет выполняться в процессоре
Не мог бы кто-нибудь предложить или предоставить пример кода о том, как реализовать вышеуказанную функциональность
Ответ №1:
Вы можете определить считыватель с пошаговой областью и возвращать требуемый тип на основе параметра задания:
@Bean
@StepScope
public ItemStreamReader<Person> itemReader(@Value("#{jobParameters['file']}") String file) {
if (file != null) {
//return a FlatFileItemReader<Person> configured with the `file` parameter
} else {
// return a JdbcCursorItemReader<Person> or a JdbcPagingItemReader<Person>
}
}
С этим на месте вы можете запускать свою работу следующим образом:
java -jar myjob.jar
: при этом будет использоваться считыватель jdbcjava -jar myjob.jar file=myfile.csv
: при этом будет использоваться средство чтения файлов
Комментарии:
1. PagingJdbcItemReader использует ключи сортировки и номер строки (т.Е. Oracle) и читает фрагмент за фрагментом, я хотел понять, как работает flatfileitemreader: извлекает ли он всю запись сразу или считывает из файла в зависимости от размера фрагмента?
2. Это другой вопрос. Отвечает ли этот ответ на ваш первоначальный вопрос? Вы можете вернуть JdbcPagingItemReader вместо JdbcCursorItemReader, если хотите,
3. спасибо за ответ . Я опубликую новый вопрос, чтобы мы могли узнать, как это работает 🙂
4. Нет необходимости в отдельном вопросе, FlatFileItemReader будет передавать записи из файла построчно, не загружая весь файл в память. Шаг, ориентированный на фрагменты, будет буферизовать строки до тех пор, пока не будет достигнут размер фрагмента, Затем он вызовет процессор / запись перед переходом к следующему фрагменту и т. Д.: docs.spring.io/spring-batch/docs/4.3.x/reference/html /…
Ответ №2:
Вы можете написать свою собственную реализацию org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader
с проверкой существования файла и зависит от результата, возвращаемого программой чтения Jdbc или программой чтения файлов