我正在关注有关如何通过spring集成和SseEmitter收听文件夹的教程。我现在有以下代码:
@Bean
IntegrationFlow inboundFlow ( @Value("${input-dir:file:C:\\Users\\kader\\Desktop\\Scaned\\}") File in){
return IntegrationFlows.from(Files.inboundAdapter(in).autoCreateDirectory(true),
poller -> poller.poller(spec -> spec.fixedRate(1000L)))
.transform(File.class, File::getAbsolutePath)
.handle(String.class, (path, map) -> {
sses.forEach((sse) -> {
try {
String p = path;
sse.send(SseEmitter.event().name("spring").data(p));
}
catch (IOException e) {
throw new RuntimeException(e);
}
});
return null ;
})
.get();
}
它可以工作,但是它会发送指定目录中的所有文件,包括已经存在的文件,有什么方法可以使其忽略它们并仅发送新文件??
答案 0 :(得分:0)
好吧,实际上,因为您没有在Files.inboundAdapter()
上配置任何过滤器,所以有这样的逻辑:
// no filters are provided
else if (Boolean.FALSE.equals(this.preventDuplicates)) {
filtersNeeded.add(new AcceptAllFileListFilter<File>());
}
else { // preventDuplicates is either TRUE or NULL
filtersNeeded.add(new AcceptOnceFileListFilter<File>());
}
因此,将应用AcceptOnceFileListFilter
并且不会在后续的轮询任务中拾取任何已经轮询的文件。
但是,您实际上可能会谈论诸如“应用程序重启后”之类的问题,所以是的,在这种情况下,所有文件都将被提取。
我相信您需要研究什么是FileListFilter
并针对您的用例使用适当的方法:https://docs.spring.io/spring-integration/docs/current/reference/html/files.html#file-reading