Spring 集成 SFTP - 过滤器问题和发出的消息数量

Spring integration SFTP - issue with filters and number of messages emits

我开始使用 spring 集成 SFTP,我有一些问题。

  1. 过滤器不起作用。我有示例配置:
Sftp.inboundAdapter(ftpFileSessionFactory())
                .preserveTimestamp(true)
                .deleteRemoteFiles(false)
                .remoteDirectory(integrationProperties.getRemoteDirectory())
                .filter(sftpFileListFilter()) // doesn't work
                .patternFilter("*.xlsx") // doesn't work

还有我的 ChainFileListFilter:

private ChainFileListFilter<ChannelSftp.LsEntry> sftpFileListFilter() {
        ChainFileListFilter<ChannelSftp.LsEntry> chainFileListFilter = new ChainFileListFilter<>();
        chainFileListFilter.addFilter(new SftpPersistentAcceptOnceFileListFilter(metadataStore(), "INT"));
        chainFileListFilter.addFilter(new SftpSimplePatternFileListFilter("*.xlsx"));
        return chainFileListFilter;
    }

如果我没理解错的话,本地目录下应该只保存XLSX文件。如果是,则不适用于此配置。我是做错了什么还是误解了这个?

  1. 如何配置 SFTP 让每个下载的文件发出消息?我在文档中看到两个参数 max-messages-per-pollmax-fetch-size,但我不知道如何设置它以便每个文件都发出一条消息。我想每 24 小时同步一次文件并生成批处理作业队列。也许有解决方法?

  2. 是否有内置过滤器允许我只获取内容已更改的文件?最好的解决方案是检查文件的校验和。

非常感谢您的帮助和解释。

您不能组合 filter()patternFilter()。只能使用其中一个:最后一个会覆盖您之前使用的任何内容。换句话说:或 filter()patternFilter() - 不是两者。默认逻辑是这样的:

public SftpInboundChannelAdapterSpec patternFilter(String pattern) {
    return filter(composeFilters(new SftpSimplePatternFileListFilter(pattern)));
}

private CompositeFileListFilter<ChannelSftp.LsEntry> composeFilters(FileListFilter<ChannelSftp.LsEntry>
        fileListFilter) {
    CompositeFileListFilter<ChannelSftp.LsEntry> compositeFileListFilter = new CompositeFileListFilter<>();
    compositeFileListFilter.addFilters(fileListFilter,
            new SftpPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "sftpMessageSource"));
    return compositeFileListFilter;
}

因此,从技术上讲,如果您不使用外部持久性 MetadataStore,则不需要自定义的。但如果这样做,请考虑将 SftpSimplePatternFileListFilterSftpPersistentAcceptOnceFileListFilter 翻转。因为最好在将文件存储到 MetadataStore.

之前检查模式

事实上,每个同步的远程文件,通过这些过滤器,都存储在本地目录中,并且当轮询器发出请求时,该本地文件的消息会立即发出。

当我们将远程文件加载到本地目录时,maxFetchSize 发挥作用。 maxMessagesPerPoll 从轮询器中使用,但那些已经从本地文件构建。该消息是按本地文件发出的,而不是作为所有文件的批处理。这不是消息传递的目的。

请分享更多信息,哪些不适用于文件。 SftpPersistentAcceptOnceFileListFilter 不仅检查文件名,还检查文件的 mtime。因此,它与任何校验和无关,而是文件的更多最后修改时间戳。