Как читать все файлы в папке с spring-batch и MultiResourceItemReader?
Я хочу настроить spring-batch на последовательное чтение всех csv файлов внутри определенной папки.
Следующее не работает, потому что делегат попытается открыть файл с именем *.csv, что, конечно же, недопустимо. Что я должен здесь изменить?
@Bean
public ItemReader<String> reader() {
MultiResourceItemReader<String> reader = new MultiResourceItemReader<>();
reader.setResources(new Resource[] {new FileSystemResource("/myfolder/*.csv")});
reader.setDelegate(new FlatFileItemReader<>(..));
return reader;
}
Эквивалентная конфигурация xml была бы записана следующим образом, как я мог бы переписать ее только на Java config?
<bean id="reader" class="org.springframework.batch.item.file.MultiResourceItemReader">
<property name="resources" value="/mypfolder/*.csv"/>
<property name="delegate" ref="flatFileItemReader"/>
</bean>
4 ответов:
Я думаю, что вы должны использовать
PathMatchingResourcePatternResolver.
Используйте PathMatchingResourcePatternResolver вот так.
@Bean public ItemReader<String> reader() { Resource[] resources = null; ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver(); try { resources = patternResolver.getResources("/myfolder/*.csv"); } catch (IOException e) { e.printStackTrace(); } MultiResourceItemReader<String> reader = new MultiResourceItemReader<>(); reader.setResources(resources); reader.setDelegate(new FlatFileItemReader<>(..)); return reader;}
Чтение нескольких файлов из абсолютный путь к файлу:
@Bean public MultiResourceItemReader<POJO> multiResourceItemReader() { MultiResourceItemReader<POJO> resourceItemReader = new MultiResourceItemReader<POJO>(); ClassLoader cl = this.getClass().getClassLoader(); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl); Resource[] resources = resolver.getResources("file:" + filePath ); resourceItemReader.setResources(resources); resourceItemReader.setDelegate(reader()); return resourceItemReader; } @Bean public FlatFileItemReader<POJO> reader() { FlatFileItemReader<POJO> reader = new FlatFileItemReader<POJO>(); reader.setLineMapper(new DefaultLineMapper() {{ setLineTokenizer(new DelimitedLineTokenizer() {{ setNames(new String[]{"id1", "POJO"}); }}); setFieldSetMapper(new BeanWrapperFieldSetMapper<POJO>() {{ setTargetType(POJO.class); }}); }}); return reader; }
В качестве альтернативы @значение Примечания могут использоваться, чтобы позволить ResourceArrayPropertyEditor преобразования строковых ресурсов[].
@Bean @StepScope public ItemReader<String> reader( @Value("file:/myfolder/*.csv") Resource[] resources ) { MultiResourceItemReader<String> reader = new MultiResourceItemReader<>(); reader.setResources(resources); reader.setDelegate(new FlatFileItemReader<>(..)); return reader; }
Comments