如何对新文件使用IntegrationFlows?

时间:2018-08-10 17:15:11

标签: spring spring-integration spring-integration-dsl

我正在关注有关如何通过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();
}

它可以工作,但是它会发送指定目录中的所有文件,包括已经存在的文件,有什么方法可以使其忽略它们并仅发送新文件??

1 个答案:

答案 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