spring 集成中将过滤器应用于入站 ftp 适配器的顺序

Order in which filters are applied to Inbound ftp adapters in spring integration

我正在使用 spring 集成入站通道适配器,如下所示

inboundAdapter(csf).preserveTimestamp(true)//
              .remoteDirectory(feed.getRemoteDirectory())//
              .regexFilter(feed.getRegexFilter())// regex expression
              .filter(ftpRemoteFileFilter)// remote filter
              .deleteRemoteFiles(feed.getDeleteRemoteF

所以我正在使用远程过滤器和开箱即用的正则表达式过滤器。我想知道正则表达式过滤器和远程过滤器的应用顺序是什么。从最初的分析来看,regex 过滤器似乎排在第一位,有人可以告诉我做出此决定的类,以便我可以确定。

如果无法知道唯一的其他选择是使用 CompositeFileListFilter.

您要查找的代码在 FtpInboundChannelAdapterSpec 中,看起来像:

@Override
public FtpInboundChannelAdapterSpec regexFilter(String regex) {
    return filter(composeFilters(new FtpRegexPatternFileListFilter(regex)));
}

@SuppressWarnings("unchecked")
private CompositeFileListFilter<FTPFile> composeFilters(FileListFilter<FTPFile> fileListFilter) {
    CompositeFileListFilter<FTPFile> compositeFileListFilter = new CompositeFileListFilter<>();
    compositeFileListFilter.addFilters(fileListFilter,
            new FtpPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "ftpMessageSource"));
    return compositeFileListFilter;
}

因此,正如您在声明 regexFilter 时看到的那样,它与 FtpPersistentAcceptOnceFileListFilterCompositeFileListFilter 一起组成,其中 regexFilter 肯定是第一个。首先是因为 FtpPersistentAcceptOnceFileListFilter 持久性 并且存储之后可能与正则表达式不匹配的文件是不好的。

如果您需要一些更复杂的逻辑,您真的应该采用 CompositeFileListFilter 方式并仅通过 filter() 选项注入它。我的意思是您必须将 regexpFilter 合并到 CompositeFileListFilter 而不是 regexFilter().

注意:在 5.0 中将 Java DSL 移动到核心后,.filter() 选项如下所示:

public S filter(FileListFilter<F> filter) {
    this.synchronizer.setFilter(filter);
    return _this();
}

它会覆盖之前提供的任何过滤器,包括 regexp。这样做是为了避免与 .filter() 链混淆,以支持外部配置的 CompositeFileListFilterChainFileListFilter