В Spring Integration 4 у меня был такой код, использующий проект Java-интеграции Spring:
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.Это сработало замечательно.
Код для фильтра (оригинальный проект java dsl), который regexFilter переносит:
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, который принимает мойпостоянное метаданное хранилища теперь заменено на FtpPersistentAcceptOnceFileListFilter, который принимает SimpleMetaDataStore.
Так что теперь, хотя код прекрасно компилируется, когда он запускается, он получает дубликаты.
Поэтому вопрос в том, почему он был изменен и существуетхорошая причина, почему это было изменено?Потому что в силу неочевидного побочного эффекта метода regexFilter он становится довольно непригодным для использования.