Spring批处理 - 获取有关目录中文件的信息

时间:2018-06-15 23:19:29

标签: spring spring-batch

因此,我第一次使用Spring Batch并尝试了解除了处理CSV文件之外的其他操作。

例如,尝试读取目录中的每个音乐文件,我有以下代码,但我不确定如何处理Delegate部分。

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    public MusicItemProcessor processor() {
        return new MusicItemProcessor();
    }

    @Bean
    public Job readFiles() {
        return jobBuilderFactory.get("readFiles").incrementer(new RunIdIncrementer()).
                flow(step1()).end().build();
    }

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1").<String, String>chunk(10)
                .reader(reader())
                .processor(processor()).build();
    }

    @Bean
    public ItemReader<String> reader() {
        Resource[] resources = null;
        ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
        try {
            resources = patternResolver.getResources("file:/music/*.flac");
        } catch (IOException e) {
            e.printStackTrace();
        }

        MultiResourceItemReader<String> reader = new MultiResourceItemReader<>();
        reader.setResources(resources);
        reader.setDelegate(new FlatFileItemReader<>()); // ??

        return reader;
    }

}

目前我可以看到资源有一个音乐文件列表,但是看看我回来的堆栈跟踪,我觉得new FlatFileItemReader<>()试图读取文件的实际内容(I&# 39;我想在某个时刻做到这一点,现在就不行了。

目前我只想要有关文件的信息(绝对路径,大小,文件名等),而不是内部的信息。

我完全错了吗?或者我只是需要配置一些不同的东西?

除了处理CSV行之外的任何代码示例都非常棒

1 个答案:

答案 0 :(得分:1)

在搜索互联网之后,我已经设法将我认为有用的东西拉到一起......一些反馈会受到欢迎。

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    public VideoItemProcessor processor() {
        return new VideoItemProcessor();
    }

    @Bean
    public Job readFiles() {
        return jobBuilderFactory.get("readFiles")
                .start(step())
                .build();
    }

    @Bean
    public Step step() {
        try {
            return stepBuilderFactory.get("step").<File, Video>chunk(500)
                    .reader(directoryItemReader())
                    .processor(processor())
                    .build();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Bean
    public DirectoryItemReader directoryItemReader() throws IOException {
        return new DirectoryItemReader("file:/media/media/Music/**/*.flac");
    }
}

让我无法为文件创建自定义阅读器的部分。如果有其他人遇到过这个问题,我就是这样做的。我确信有更好的方法,但这对我有用

public class DirectoryItemReader implements ItemReader<File>, InitializingBean {
    private final String directoryPath;

    private final List<File> foundFiles = Collections.synchronizedList(new ArrayList<>());

    public DirectoryItemReader(final String directoryPath) {
        this.directoryPath = directoryPath;
    }

    @Override
    public File read() {
        if (!foundFiles.isEmpty()) {
            return foundFiles.remove(0);
        }

        synchronized (foundFiles) {
            final Iterator files = foundFiles.iterator();

            if (files.hasNext()) {
                return foundFiles.remove(0);
            }
        }

        return null;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        for (final Resource file : getFiles()) {
            this.foundFiles.add(file.getFile());
        }
    }

    private Resource[] getFiles() throws IOException {
        ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
        return patternResolver.getResources(directoryPath);
    }
}

您唯一需要做的就是实现自己的处理器。我在这个例子中使用了视频,所以我有一个视频处理器

@Slf4j
public class VideoItemProcessor implements ItemProcessor<File, Video> {

    @Override
    public Video process(final File item) throws Exception {
        Video video = Video.builder()
                .filename(item.getAbsoluteFile().getName())
                .absolutePath(item.getAbsolutePath())
                .fileSize(item.getTotalSpace())
                .build();

        log.info("Created {}", video);

        return video;
    }
}