Синхронизатор файлов Spring Integration: принимать файлы на основе предварительно определенного списка

Я передаю файлы с удаленного на локальный по Sftp для обработки. Я хочу передавать только файлы .csv, и у меня есть список предопределенных имен файлов.

Я не смог найти FileListFilter, который позволяет указать несколько шаблонов и передать, если хотя бы один совпал.

Пока у меня есть этот код, который работает для фильтрации «.csv».

Процесс интеграции

@Bean
    public IntegrationFlow integFlow() {
        return IntegrationFlows
            .from(ftpMessageSource(), c -> poller())
            ... more processing

Источник сообщения

public MessageSource<File> ftpMessageSource() {

            SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sessionFactory);
            fileSynchronizer.setRemoteDirectory(remoteDirectory);
            fileSynchronizer.setDeleteRemoteFiles(true);
            fileSynchronizer.setFilter(new SftpRegexPatternFileListFilter(Constantes.EXTENSION));
            SftpInboundFileSynchronizingMessageSource ftpInboundFileSync = 
                new SftpInboundFileSynchronizingMessageSource(fileSynchronizer);

            ftpInboundFileSync.setLocalDirectory(new File(workDirectory));
            ftpInboundFileSync.setAutoCreateLocalDirectory(true);
            CompositeFileListFilter<File> compositeFileListFilter = new CompositeFileListFilter<>();
            compositeFileListFilter.addFilter(new RegexPatternFileListFilter(Constantes.EXTENSION));
            ftpInboundFileSync.setLocalFilter(compositeFileListFilter);
            return ftpInboundFileSync;
    }

Constantes.EXTENSION — это регулярное выражение, принимающее файлы .csv и .CSV. Это прекрасно работает.

Скажем, у меня есть список String, который содержит "string1", "string2", "string3", и я хочу передать каждый файл формы string1*, string2* или string3*. Как мне поступить?


person capitaineballs    schedule 03.12.2019    source источник
comment
Одним из решений было бы настроить уродливое регулярное выражение, которое проверяет каждое из моих имен файлов? На сегодняшний день в этом списке 7 пунктов, которые не сильно изменятся в будущем. Но я бы предпочел этого не делать   -  person capitaineballs    schedule 03.12.2019


Ответы (2)


Есть CompositeFileListFilter:

* Simple {@link FileListFilter} that predicates its matches against <b>all</b> of the
* configured {@link FileListFilter}.

С такой логикой:

public boolean accept(F file) {
    AtomicBoolean allAccept = new AtomicBoolean(true);
    // we can't use stream().allMatch() because we have to call all filters for this filter's contract
    this.fileFilters.forEach(f -> allAccept.compareAndSet(true, f.accept(file)));
    return allAccept.get();
}

Итак, вы настраиваете этот CompositeFileListFilter с несколькими делегатами SftpRegexPatternFileListFilter, и ваши файлы будут обрабатываться всякий раз, когда они будут использовать хотя бы один из фильтров в файле CompositeFileListFilter.

Подробнее о фильтрах см. в документации: https://docs.spring.io/spring-integration/docs/current/reference/html/file.html#file-reading

person Artem Bilan    schedule 03.12.2019

person    schedule
comment
Выглядит именно так, как мне нужно, и простая реализация с базовым FileListFilter. Я попробую это на работе завтра и обновлю соответственно - person capitaineballs; 03.12.2019