我写了一个从Sftp服务器下载文件的应用程序,我想实现的是只下载ZIP文件,而且只在它们被修改后才下载。
我写过一个SftpInboundFileSynchronizer
和几个InboundChannelAdapter
,奇怪的是同一个文件被下载了一遍又一遍,我知道关键是选择正确的过滤器,但我不知道如何完成。
public static final String SYNCHRONIZER_BEAN_NAME = "synchorinzer-bean-name";
@Bean(SYNCHRONIZER_BEAN_NAME)
public SftpInboundFileSynchronizer synchronizer(
SessionFactory<SftpClient.DirEntry> sf,
PropertiesPersistingMetadataStore ms,
AppProps cfg) {
SftpInboundFileSynchronizer sync = new SftpInboundFileSynchronizer(sf);
sync.setDeleteRemoteFiles(false);
sync.setRemoteDirectory(cfg.getFtpRemoteDirectory());
sync.setPreserveTimestamp(true);
// sync.setFilter(); ????
return sync;
}
public static final String GIPUZKOANA_OUT_CHANNEL_NAME = "GIPUZKOANA_OUT_CHANNEL";
public static final String GIPUZKOANA_SYNCHRONIZER_BEAN_NAME = "GIPUZKOANA_FILE_SYNCHRONIZER_BEAN";
@Bean(GIPUZKOANA_SYNCHRONIZER_BEAN_NAME)
@InboundChannelAdapter(channel = GIPUZKOANA_OUT_CHANNEL_NAME)
public MessageSource<File> gipuzkoanaMessageSource(
@Qualifier(SYNCHRONIZER_BEAN_NAME) SftpInboundFileSynchronizer sync,
AppProps cfg) {
SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(sync);
source.setLocalDirectory(cfg.getGtfsLocalDirSyncGtfs());
source.setAutoCreateLocalDirectory(true);
source.setMaxFetchSize(1);
source.setLoggingEnabled(true);
source.setLocalFilter(files -> Lists.newArrayList(files)
.stream()
.filter(f -> f.getName().equalsIgnoreCase(cfg.getGtfsGipuzkoana()))
.collect(Collectors.toList()));
return source;
}
// ...
到目前为止,我已经尝试了new SftpPersistentAcceptOnceFileListFilter(ms, "gtfs_")
,new SftpSimplePatternFileListFilter("*.zip")
...但没有运气。
怎样才能达到我想要的?
谢谢!
2条答案
按热度按时间c9qzyr3d1#
尝试使用类似这样的方法:
这样,它将首先检查文件扩展名,然后在处理后检查其先前的状态。
不确定您的“仅当它们已被修改时”,因为此过滤器无法了解这种状态。您可以尝试对SFTP进行
LastModifiedFileListFilter
修改,以确保文件足够旧,可以被拉取。twh00eeo2#
要仅下载ZIP文件和已修改的文件,您可以在 SftpInboundFileSynchronizingMessageSource 上设置适当的过滤器。
您可以使用 AcceptOnceFileListFilter 和 SimplePatternFileListFilter 的组合来实现此目的。AcceptOnceFileListFilter 将确保文件只下载一次,而 SimplePatternFileListFilter 将限制下载的文件仅为ZIP文件。
以下是 gipuzkoanaMessageSource 方法的更新实现: