如何使用spring-batch连续读取文件夹中的文件?

时间:2017-05-02 13:55:56

标签: java spring-batch

我使用spring-batch使用csv处理文件夹中的多个spring-batch文件。类似如下:

    @Bean
    public ItemReader<String> reader() {
        MultiResourceItemReader<String> reader = new MultiResourceItemReader<>();
        reader.setResources(new Resource[] {new FileSystemResource("/myfolder/*.csv")});
        reader.setDelegate(new FlatFileItemReader<>(..));
        return reader;
    }

作业是单线程执行者。

问题:每当新文件添加到文件夹时,如何将它们添加到列表中并使用作业自动导入它们?

此文件夹中每天大约有30.000个文件。 我可以告诉spring-batch自动检测新文件吗?

或者我是否总是必须在作业结束后立即重新启动作业,然后开始导入作业运行时添加的文件?

3 个答案:

答案 0 :(得分:1)

您可以使用定期运行Spring批处理应用程序的cron计时器来解决此问题。因此,您需要移动已处理的文件。或者您可以使用java 7文件观察器Java Documentation

但是使用此设置,您必须自己处理事件。例如,当一个新文件到达时。

答案 1 :(得分:1)

有点偏离主题,但是当你这样做时,为

创建目录

1)INPUT

2)INPROGESS

3)完成

4)错误

然后按照Stimpson Cat的建议从CRON运行Java作业。 Jave作业将在INPUT中查找任何文件,将它们移动到INPROGRESS中,然后再将它们处理为DONE或ERROR。

答案 2 :(得分:1)

SpringBatch是一个静态的&#34;事情。一旦工作开始,它就被定义了它将做什么,并且这不能改变(......没有讨厌的黑客攻击)。

因此,一旦作业开始,您就无法更改MultiResourceItemReader的定义。

因此,一次执行作业只处理作业启动时存在的文件,为了处理稍后到达的文件,需要触发另一次作业执行。

理解SpringBatch不是一个工作控制系统是很重要的。 SpringBatch用于定义作业并执行作业运行。但是,为了触发要启动的作业,您还需要其他内容。

正如所建议的,这可能是一个cron-job,spring-integration,spring Scheduler-Annotations,......正如Stimpson Cat所建议的那样。

此外,根据我自己的经验,我还建议使用Essex Boy提出的目录结构