1

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

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

所以我使用远程过滤器和开箱即用的正则表达式过滤器。我想知道应用正则表达式过滤器和远程过滤器的顺序是什么。从最初的分析看来,正则表达式过滤器是第一位的,有人可以告诉我这个决定是在哪里做出的,这样我就可以确定了。

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

4

1 回答 1

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的,它与 the 一起组成FtpPersistentAcceptOnceFileListFilterCompositeFileListFilter其中regexFilter肯定是第一个。首先是因为FtpPersistentAcceptOnceFileListFilter持久,存储可能与正则表达式不匹配的文件并不好。

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

注意:将 Java DSL 移入 Core in 后5.0.filter()选项如下所示:

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

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

于 2017-05-17T16:02:44.270 回答