я использую
- Интеграция Sprint (файл, SFTP и т. Д.) 4.3.6
- Spring загрузки 1.4.3
- Интеграция Spring Java DSL 1.1.4
и я пытаюсь настроить исходящий адаптер SFTP, который позволил бы мне переместить файл в каталог в удаленной системе, а также удалить или переименовать файл в моей локальной системе.
Так, например, я хотел бы поместить файл a.txt в локальный каталог и привязать его по SFTP к удаленному серверу в каталоге inbound. После завершения передачи я хотел бы удалить или переименовать локальную копию a.txt.
Я подбирал для этого несколько способов. Итак, вот мой общий SessionFactory для теста.
protected SessionFactory<ChannelSftp.LsEntry> buildSftpSessionFactory() {
DefaultSftpSessionFactory sessionFactory = new DefaultSftpSessionFactory();
sessionFactory.setHost("localhost");
sessionFactory.setUser("user");
sessionFactory.setAllowUnknownKeys(true);
sessionFactory.setPassword("pass");
CachingSessionFactory<ChannelSftp.LsEntry> cachingSessionFactory = new CachingSessionFactory<>(sessionFactory, 1);
return cachingSessionFactory;
}
Это преобразователь, который мне нужно добавить в сообщение
@Override
public Message<File> transform(Message<File> source) {
System.out.println("here is the thing : "+source);
File file = (File)source.getPayload();
Message<File> transformedMessage = MessageBuilder.withPayload(file)
.copyHeaders(source.getHeaders())
.setHeaderIfAbsent(FileHeaders.ORIGINAL_FILE, file)
.setHeaderIfAbsent(FileHeaders.FILENAME, file.getName())
.build();
return transformedMessage;
}
Затем у меня есть поток интеграции, который использует опросчик для просмотра локального каталога и вызывает это:
@Bean
public IntegrationFlow pushTheFile(){
return IntegrationFlows
.from(s -> s.file(new File(DIR_TO_WATCH))
.patternFilter("*.txt").preventDuplicates(),
e -> e.poller(Pollers.fixedDelay(100)))
.transform(outboundTransformer)
.handle(Sftp.outboundAdapter(this.buildSftpSessionFactory())
.remoteFileSeparator("/")
.useTemporaryFileName(false)
.remoteDirectory("inbound/")
)
.get();
}
Это нормально работает, но оставляет локальный файл. Любые идеи о том, как удалить этот локальный файл после завершения загрузки? Должен ли я вместо этого смотреть на SftpOutboundGateway
?
Заранее спасибо!
Ответ Артема сработал отлично! Вот быстрый пример, который удаляет локальный файл после его отправки.
@Bean
public IntegrationFlow pushTheFile(){
return IntegrationFlows
.from(s -> s.file(new File(DIR_TO_WATCH))
.patternFilter("*.txt").preventDuplicates(),
e -> e.poller(Pollers.fixedDelay(100)))
.transform(outboundTransformer)
.handle(Sftp.outboundAdapter(this.buildSftpSessionFactory())
.remoteFileSeparator("/")
.useTemporaryFileName(false)
.remoteDirectory("inbound/"), c -> c.advice(expressionAdvice(c))
)
.get();
}
@Bean
public Advice expressionAdvice(GenericEndpointSpec<FileTransferringMessageHandler<ChannelSftp.LsEntry>> c) {
ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
advice.setOnSuccessExpression("payload.delete()");
advice.setOnFailureExpression("payload + ' failed to upload'");
advice.setTrapException(true);
return advice;
}