- Sprint整合(文件,SFTP等)4.3.6
- 春季啓動1.4.3
- Spring集成的Java DSL 1.1。 4
我試圖設置一個SFTP出站適配器,該適配器允許我將文件移動到遠程系統上的目錄,並刪除或重命名本地系統中的文件。
所以,舉例來說,我想將一個文件,A.TXT,在本地目錄,並將它在目錄入境 SFTP'ed到遠程服務器。一旦傳輸完成,我希望刪除或重命名本地副本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
而不是?
在此先感謝!
Artem的答案完美無缺!這是一個快速示例,它在推送後刪除本地文件。
@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;
}
可能,這將幫助你 - HTTP://堆棧溢出。com/questions/36247467/spring-sftp-inbound-chanel-adapter -delete-local-file?rq = 1 –