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

时间:2017-05-17 15:33:54

标签: ftp spring-integration spring-integration-sftp

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

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

所以我使用远程过滤器和开箱即用的正则表达式过滤器。我想知道正则表达式过滤器和远程过滤器的应用顺序是什么。从最初的分析看起来首先是正则表达式过滤器,有人可以告诉我做出这个决定的clas,所以我可以肯定。

如果没有办法知道唯一的其他选择将是使用 CompositeFileListFilter

1 个答案:

答案 0 :(得分:1)

您要查找的代码位于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时所看到的那样,它与FtpPersistentAcceptOnceFileListFilter一起组成CompositeFileListFilter,其中regexFilter绝对是第一位。它首先是因为FtpPersistentAcceptOnceFileListFilter持久性而且存储可能与之后的正则表达式不匹配的文件并不好。

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

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

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

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