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
时看到的那样,它与 FtpPersistentAcceptOnceFileListFilter
到 CompositeFileListFilter
一起组成,其中 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()
链混淆,以支持外部配置的 CompositeFileListFilter
或 ChainFileListFilter
。
我正在使用 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
时看到的那样,它与 FtpPersistentAcceptOnceFileListFilter
到 CompositeFileListFilter
一起组成,其中 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()
链混淆,以支持外部配置的 CompositeFileListFilter
或 ChainFileListFilter
。