#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();
}
Ответ №1:
Используйте исходящий шлюз с рекурсивной командой MGET для извлечения полного дерева.
С помощью команды mget mget извлекает несколько удаленных файлов на основе шаблона и поддерживает следующие параметры:
-P: Сохраните временные метки удаленных файлов.
-R: Рекурсивно извлеките все дерево каталогов.
-x: Создайте исключение, если ни один файл не соответствует шаблону (в противном случае возвращается пустой список).
-D: Удалите каждый удаленный файл после успешной передачи. Если передача игнорируется, удаленный файл не удаляется, так как FileExistsMode ИГНОРИРУЕТСЯ, а локальный файл уже существует.
Полезная нагрузка сообщения, полученная в результате операции mget, представляет собой объект списка (то есть Список файловых объектов, каждый из которых представляет извлеченный файл).