복붙노트

[SPRING] spring-batch와 MultiResourceItemReader로 폴더의 모든 파일을 읽는 방법?

SPRING

spring-batch와 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>

해결법

  1. ==============================

    1.PathMatchingResourcePatternResolver를 사용해야한다고 생각합니다.

    PathMatchingResourcePatternResolver를 사용해야한다고 생각합니다.

  2. ==============================

    2.이처럼 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;
    

    }

  3. ==============================

    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;
          }
    
  4. ==============================

    4.@Value 주석은 ResourceArrayPropertyEditor가 문자열을 Resource []로 변환시키는 데 사용될 수 있습니다.

    @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;
    }
    
  5. from https://stackoverflow.com/questions/31700520/how-to-read-all-files-in-a-folder-with-spring-batch-and-multiresourceitemreader by cc-by-sa and MIT license