在 Spring Integration 4 中,我使用 spring integration java dsl 项目编写了这样的代码:
FtpInboundChannelAdapterSpec ftpAdapterSpec = Ftp.inboundAdapter(ftpSessionFactory)
.preserveTimestamp(true)
.remoteDirectory(remoteFolder)
.filter(new FtpPersistentAcceptOnceFileListFilter(metaDataStore, "ftp-inbound-" + id + ":"))
.regexFilter(".*")
.localDirectory(Paths.get(System.getProperty("java.io.tmpdir"), "ftp-inbound", localPath).toFile()).autoCreateLocalDirectory(true)
.deleteRemoteFiles(false);
注意它是如何包含一个正则表达式过滤器和一个 FtpPersistentAcceptOnceFilterListFilter 的。这很好用。
regexFilter 包装的过滤器(原始 java dsl 项目)的代码是:
public S filter(FileListFilter<F> filter) {
if (this.filter == null) {
if (filter instanceof CompositeFileListFilter) {
this.filter = (CompositeFileListFilter<F>) filter;
}
else {
this.filter = new CompositeFileListFilter<F>();
this.filter.addFilter(filter);
}
this.synchronizer.setFilter(this.filter);
}
else {
this.filter.addFilter(filter);
}
return _this();
}
如您所见,它从传入的过滤器构建了一个复合过滤器(并在您传入更多时堆叠)。
但是,当将 java dsl 引入核心集成时,过滤器方法更改为:
public S filter(FileListFilter<F> filter) {
this.synchronizer.setFilter(filter);
return _this();
}
这本身很好,但是像 regexFilter 这样的方法变成了:
@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;
}
所以现在我没有的代码做了我想要的,因为采用我的持久元数据存储的 FtpPersistentAcceptOnceFileListFilter 现在被采用 SimpleMetaDataStore 的 FtpPersistentAcceptOnceFileListFilter 替换。
所以现在虽然代码在运行时编译得很好,但它会收到重复项。
所以问题是它为什么会改变,是否有充分的理由改变它?因为就目前而言,由于 regexFilter 方法的不明显副作用,它变得相当不可用。