我在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上的记录。我想要的是,如果应用程序重新启动,应用程序将考虑先前下载的文件,并最终只下载新的或更新的文件。我怎么能这样做?
谢谢大家