Динамический считыватель Spring batch

#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 : при этом будет использоваться считыватель jdbc
  • java -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 или программой чтения файлов