我正在使用spring集成入站通道适配器,如下所示
inboundAdapter(csf).preserveTimestamp(true)//
.remoteDirectory(feed.getRemoteDirectory())//
.regexFilter(feed.getRegexFilter())// regex expression
.filter(ftpRemoteFileFilter)// remote filter
.deleteRemoteFiles(feed.getDeleteRemoteF
所以我使用远程过滤器和开箱即用的正则表达式过滤器。我想知道正则表达式过滤器和远程过滤器的应用顺序是什么。从最初的分析看起来首先是正则表达式过滤器,有人可以告诉我做出这个决定的clas,所以我可以肯定。
如果没有办法知道唯一的其他选择将是使用
CompositeFileListFilter
。
答案 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()
链混淆,转而支持外部配置的CompositeFileListFilter
或ChainFileListFilter
。