Spring Boot - Sftp集成 - 如何避免在应用程序重启时重新下载文件?

时间:2018-05-15 11:15:29

标签: java spring spring-boot sftp spring-integration-sftp

我在Spring启动时完成了一个配置,它使用 SftpInboundFileSynchronizer

将远程文件夹同步到本地文件夹 代码下面的

@Bean
public MongoTemplate mongoTemplate() throws Exception {
    return new MongoTemplate(mongoDbConfiguration.mongoClient(), "bd");
}

@Bean
public ConcurrentMetadataStore store() {
    try {
        MongoDbMetadataStore store = new MongoDbMetadataStore(mongoTemplate(), "sftp_file_download");
        return store;
    } catch (Exception e) {
        PropertiesPersistingMetadataStore store = new PropertiesPersistingMetadataStore();
        store.setFileName("sftpStore.properties");
        return store;
    }
}

@Bean
public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() {
    SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory());
    fileSynchronizer.setDeleteRemoteFiles(false);
    fileSynchronizer.setRemoteDirectory(sftpRemoteDirectoryDownload);
    CompositeFileListFilter<ChannelSftp.LsEntry> compositeFileListFilter = new CompositeFileListFilter();
    compositeFileListFilter.addFilter(new SftpPersistentAcceptOnceFileListFilter(store(), ""));
    compositeFileListFilter.addFilter(new SftpSimplePatternFileListFilter(sftpRemoteDirectoryDownloadFilter));
    fileSynchronizer.setFilter(compositeFileListFilter);
    fileSynchronizer.setPreserveTimestamp(true);
    return fileSynchronizer;
}

@Bean
@InboundChannelAdapter(channel = "fromSftpChannel", poller = @Poller(cron = "0/5 * * * * *")) //poller = @Poller(cron = "0 02 12 ? * MON-THU"))
public MessageSource<File> sftpMessageSource() {
    SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(
            sftpInboundFileSynchronizer());
    source.setLocalDirectory(new File(sftpLocalDirectoryDownload));
    source.setAutoCreateLocalDirectory(true);
    source.setLocalFilter(new AcceptOnceFileListFilter<File>());
    return source;
}

@Bean
@ServiceActivator(inputChannel = "fromSftpChannel")
public MessageHandler resultFileHandler() {
    return new MessageHandler() {

        @Override
        public void handleMessage(Message<?> message) throws MessagingException {

            System.err.println(message.getPayload());
            File file = (File) message.getPayload();

            doImport(file);
        }
    };
}

行为如下..当应用程序开始下载本地文件夹上的所有文件并在mongoDB集合上保存那些存储文件名和文件时间戳的文件时跟踪:

  

{       &#34; _id&#34; :&#34; output_20180511.csv&#34;,       &#34;值&#34; :&#34; 1526061834000&#34;   }

每个人都能很好地工作,但有两件事我无法理解。

  • 想象一下,我从本地文件夹中删除名为 output_20180511.csv 的文件,并从mongodb中删除记录。我希望再次下载该文件,mongodb上的记录会被重写, MessageHandler 可以捕获该消息,但在重新创建文件和记录时,MessageHandler不会收到任何消息因此我无法处理该文件。为什么会这样?

  • 想象一下,在同步后我需要重启应用程序。此配置现在发生的是应用程序重新下载所有文件而不考虑存储在mongodb上的记录。我想要的是,如果应用程序重新启动,应用程序将考虑先前下载的文件,并最终只下载新的或更新的文件。我怎么能这样做?

谢谢大家

0 个答案:

没有答案