web-dev-qa-db-ja.com

スプリングバッチとMultiResourceItemReaderを使用してフォルダー内のすべてのファイルを読み取る方法は?

特定のフォルダー内のすべてのcsvファイルを順番に読み取るようにspring-batchを構成したい。

デリゲートが*.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構成のみに書き換えることができますか?

<bean id="reader" class="org.springframework.batch.item.file.MultiResourceItemReader">
        <property name="resources" value="/mypfolder/*.csv"/>
        <property name="delegate" ref="flatFileItemReader"/>
</bean>
11
membersound

PathMatchingResourcePatternResolver を使用する必要があると思います。

10

このように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;

}

10

または、@ Valueアノテーションを使用して、ResourceArrayPropertyEditorで文字列をResource []に​​変換できます。

@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;
}
3

絶対ファイルパスから複数のファイルを読み取る:

 @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;
      }
2
Niraj Sonawane