Весенняя интеграция (SFTP): проблема с загрузкой файлов из подкаталогов

#spring-integration #spring-integration-sftp

Вопрос:

Я использую Spring Integration версии 5.4.4 в приложении Spring Boot. Мне нужно получить все XML-файлы из подкаталогов в каталоге «server_sftp». Для этого я использую адаптер входящего канала потоковой передачи SFTP и шлюз исходящего канала SFTP с командой mget. К сожалению, приложение загружает файлы только из корневого каталога («server_sftp») и не загружает файлы из подкаталогов.

Где я ошибаюсь?

 @Bean
@InboundChannelAdapter(channel = "downloadXmlFileInputChannel", poller = @Poller(fixedDelay = "300000"))
public MessageSource<InputStream> sftpXmlFileMessageSource() {
    SftpStreamingMessageSource messageSource = new SftpStreamingMessageSource(template());
    messageSource.setRemoteDirectory("server_sftp/");
    return messageSource;
}

@Bean
public IntegrationFlow xmlFilesReadingFlow() {
    return IntegrationFlows
            .from(sftpXmlFileMessageSource(), e -> e.poller(Pollers.fixedDelay(Duration.ofSeconds(5))))
            .handle(Sftp
                    .outboundGateway(template(), Command.MGET, "'server_sftp/*'")
                    .options(Option.RECURSIVE)
                    .autoCreateLocalDirectory(true)
                    .localDirectoryExpression("'../webapps/event_report_app-1.0/xmlFilesLocalDirectory/'   #remoteDirectory")
                    .localFilenameExpression("#remoteFileName.replaceFirst('sftpSource', 'localTarget')"))
            .channel("downloadXmlFileOutputChannel")
            .get();
}

@Bean
public PollableChannel downloadXmlFileInputChannel() {
    return new QueueChannel();
}

@Bean
public DirectChannel downloadXmlFileOutputChannel() {
    return new DirectChannel();
}
 

структура каталогов на сервере sftp

Ответ №1:

Используйте исходящий шлюз с рекурсивной командой MGET для извлечения полного дерева.

С помощью команды mget mget извлекает несколько удаленных файлов на основе шаблона и поддерживает следующие параметры:

-P: Сохраните временные метки удаленных файлов.

-R: Рекурсивно извлеките все дерево каталогов.

-x: Создайте исключение, если ни один файл не соответствует шаблону (в противном случае возвращается пустой список).

-D: Удалите каждый удаленный файл после успешной передачи. Если передача игнорируется, удаленный файл не удаляется, так как FileExistsMode ИГНОРИРУЕТСЯ, а локальный файл уже существует.

Полезная нагрузка сообщения, полученная в результате операции mget, представляет собой объект списка (то есть Список файловых объектов, каждый из которых представляет извлеченный файл).