SFTP集成-SftpInboundFileSynchronizer-如何不再次下载相同文件

问题描述

在我当前的应用程序中,使用spring-batch作业,我触发了将SFTP远程文件发送到本地目录的过程,对其进行处理并在后期处理后删除文件


    @Bean("ftpMessageSource")
    @EndpointId("streamInboundAdapter")
    @InboundChannelAdapter(channel = "sftpChannel",poller = @Poller(fixedDelay = "5000"),autoStartup = "false")
    public MessageSource<File> sftpMessageSource() {
        SftpInboundFileSynchronizingMessageSource source =
                new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer());
        source.setLocalDirectory(new File("sftp-inbound"));
        source.setautocreateLocalDirectory(true);
        source.setLocalFilter(new FileSystemPersistentAcceptOnceFileListFilter(MetadataStore(),""));
        source.setMaxFetchSize(10);
        return source;
    }


    @Bean(name="fileStore")
    public PropertiesPersistingMetadataStore MetadataStore() {
        PropertiesPersistingMetadataStore MetadataStore = new PropertiesPersistingMetadataStore();
        MetadataStore.setBaseDirectory("filestore");
        MetadataStore.setFileName("filestore.properties");
        MetadataStore.afterPropertiesSet();
        return MetadataStore;
    }

在处理每个文件时,我在fileStore.properties文件中输入文件名。

    
MetadataStore.put(file.getName(),file.getName());


一个问题,我遇到了下一次处理(不重新启动服务器并再次启动相同的进程)是-进程再次获取相同的文件集进行处理。

我不想SFTP处理的文件,请您指出我缺少的配置,以避免再次下载相同的文件

解决方法

并删除文件进行后期处理。

因此,文件在本地目录中不再存在。由于您不过滤远程文件,因此它们将作为新的本地副本再次下载。

FileSystemPersistentAcceptOnceFileListFilter逻辑基于file.lastModified(),如果它与现有条目不同,则将其替换并推入下游。

请考虑在SftpPersistentAcceptOnceFileListFilter上使用sftpInboundFileSynchronizer。这样,就不会从SFTP提取相同的文件(如果有相同的lastModified)。

在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/5.3.2.RELEASE/reference/html/sftp.html#sftp-inbound