Почему поведение фильтра изменилось, когда конфигурация ftp java dsl была введена в ядро ​​интеграции Spring - PullRequest
0 голосов
/ 16 октября 2018

В 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 он становится довольно непригодным для использования.

1 Ответ

0 голосов
/ 16 октября 2018

Было изменено то, что filter(FileListFilter<F> filter) имеет приоритет над всеми остальными параметрами фильтрации, так же, как это происходит с конфигурацией XML для согласованности.Причина такого поведения только потому, что мы не знаем, в каком порядке вы хотели бы составить эти фильтры.Таким образом, для обеспечения правильного порядка вам нужно самостоятельно построить CompositeFileListFilter, включая требуемый FtpRegexPatternFileListFilter, и добавить его в эту опцию fitler().

* regexFilter() и patternFilter()все еще здесь для удобства настройки простых общих случаев использования, когда у вас есть только этот фильтр и ничего более.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...