Spring Batch Integration: SftpPersistentAcceptOnceFileListFilter сохраняет файлы с FTP-сервера, но не обрабатывает Joblauncher - PullRequest
1 голос
/ 07 октября 2019

У меня есть класс конфигурации, который постоянно опрашивает мой каталог FTP. Странное поведение заключается в том, что SftpPersistentAcceptOnceFileListFilter сохраняет файл немедленно в таблице хранилища метаданных, но не мгновенно выбирается для обработки средством запуска заданий. Я должен вручную удалить эту запись из таблицы хранилища метаданных 3-4 раза, а затем файл подбирается. это проблема кода или проблема с сервером FTP? не могу понять ..

Есть идеи, если я что-то упустил?

@Bean
public IntegrationFlow sftpInboundNocFlow(FileNocMessageToJobRequest fileNocMessageToJobRequest) throws Exception {
    return IntegrationFlows
            .from(s -> s.sftp(this.sftpConfig.sftpSessionFactory())
                            .filter(this.sftpPersistantNocFilter())
                            .preserveTimestamp(true)
                            .remoteDirectory(this.sftpProperties.getRemoteOutboundDirectoryNoc())
                            .deleteRemoteFiles(this.sftpProperties.isDeleteRemoteFilesEnabled())
                            .autoCreateLocalDirectory(true)
                            .localDirectory(new File(FileUtils.getTempDirectoryPath() + this.sftpProperties.getLocalInboundDirectoryNoc())),
                            e -> e.id("sftpInboundNocAdapter")
                            .autoStartup(true)
                            .poller(Pollers.fixedDelay(9000)))
            .handle(fileNocMessageToJobRequest)
            .handle(this.jobNocLaunchingGateway())
            .log(LoggingHandler.Level.WARN, ">>>>>>>>>>headers.id + ': ' + payload")
            .channel("nullChannel")
            .get();
}



@Bean
public CompositeFileListFilter sftpPersistantNocFilter() {
    log.info("sftpPersistantNocFilter is called");
    CompositeFileListFilter nocfilters = new CompositeFileListFilter();
    nocfilters.addFilter(new SftpPersistentAcceptOnceFileListFilter(this.metadataStore(),"Downloaded_File:"));
    nocfilters.addFilter(new SftpRegexPatternFileListFilter(".*\\bNOC\\b.*"));
   // nocfilters.addFilter(new SftpSimplePatternFileListFilter("*.csv"));
    return nocfilters;
}

1 Ответ

0 голосов
/ 07 октября 2019

Очевидно, что файлы хранятся уже в локальном каталоге и в хранилище метаданных в памяти для этих локальных файлов. Вам следует рассмотреть возможность изменения local-filter:

. Вы можете использовать атрибут local-filter для настройки поведения фильтра локальной файловой системы. Начиная с версии 4.3.8, FileSystemPersistentAcceptOnceFileListFilter настраивается по умолчанию. Этот фильтр сохраняет принятые имена файлов и измененную временную метку в экземпляре стратегии MetadataStore (см. Хранилище метаданных) и обнаруживает изменения локального времени изменения файла. MetadataStore по умолчанию - это SimpleMetadataStore, который хранит состояние в памяти.

Для получения дополнительной информации см. Документацию: https://docs.spring.io/spring-integration/docs/5.2.0.RELEASE/reference/html/sftp.html#sftp

...