使用Spring Integration检索最新修改的zip文件

zpf6vheq  于 2023-02-04  发布在  Spring
关注(0)|答案(2)|浏览(119)

我写了一个从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") ...但没有运气。
怎样才能达到我想要的?
谢谢!

c9qzyr3d

c9qzyr3d1#

尝试使用类似这样的方法:

ChainFileListFilter<SftpClient.DirEntry> chainFileListFilter =
            new ChainFileListFilter<>()
                    .addFilters(new SftpSimplePatternFileListFilter("*.zip"),
                            new SftpPersistentAcceptOnceFileListFilter(ms, "gtfs_"));
    sync.setFilter();

这样,它将首先检查文件扩展名,然后在处理后检查其先前的状态。
不确定您的“仅当它们已被修改时”,因为此过滤器无法了解这种状态。您可以尝试对SFTP进行LastModifiedFileListFilter修改,以确保文件足够旧,可以被拉取。

twh00eeo

twh00eeo2#

要仅下载ZIP文件和已修改的文件,您可以在 SftpInboundFileSynchronizingMessageSource 上设置适当的过滤器。
您可以使用 AcceptOnceFileListFilterSimplePatternFileListFilter 的组合来实现此目的。AcceptOnceFileListFilter 将确保文件只下载一次,而 SimplePatternFileListFilter 将限制下载的文件仅为ZIP文件。
以下是 gipuzkoanaMessageSource 方法的更新实现:

@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.setFilter(new CompositeFileListFilter<>(
            Arrays.asList(
                    new AcceptOnceFileListFilter<>(new SftpPersistentAcceptOnceFileListFilter(ms, "gtfs_")),
                    new SimplePatternFileListFilter("*.zip"))
    ));
    return source;
}

相关问题