我使用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自动检测新文件吗?
或者我是否总是必须在作业结束后立即重新启动作业,然后开始导入作业运行时添加的文件?
答案 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提出的目录结构