私は使用しています
- スプリント統合 (ファイル、SFTP など) 4.3.6
- スプリング ブート 1.4.3
- 春の統合 Java DSL 1.1.4
また、ファイルをリモート システムのディレクトリに移動し、ローカル システムのファイルを削除または名前変更できる SFTP アウトバウンド アダプターをセットアップしようとしています。
したがって、たとえば、ファイルa.txtをローカル ディレクトリに配置し、ディレクトリinboundのリモート サーバーに SFTP で転送したいとします。転送が完了したら、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;
}