4

私は使用しています

  • スプリント統合 (ファイル、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;
}
4

1 に答える 1