Spring Integration: Как динамически создать subdir на sftp, используя IntegrationFlow - PullRequest
0 голосов
/ 18 октября 2018

У меня есть сценарий использования для передачи файлов в sftp в определенных подкаталогах, которые создаются динамически.Я получил это с помощью пользовательского метода SftpMessageHandler и шлюза.Но проблема с этим подходом заключалась в том, что он не удалял локальные временные файлы после успешной загрузки.Чтобы решить эту проблему, теперь я использую IntegrationFlow вместе с выражением Advice (как показано ниже), это удаляет локальные файлы, но я не знаю, как динамически создавать удаленные subDir.Я читал о выражении удаленного каталога, но не уверен, как его использовать / реализовать.

Кто-нибудь решил эту проблему?Любая помощь приветствуется!

@Bean
public IntegrationFlow sftpOutboundFlow() {

    return IntegrationFlows.from("toSftpChannel")
              .handle(Sftp.outboundAdapter(this.sftpSessionFactory())
                      .remoteFileSeparator("/")
                      .useTemporaryFileName(false)
                      .remoteDirectory("/temp"), c -> c.advice(expressionAdvice(c)))
                                     .get();
}



@Bean
public Advice expressionAdvice(GenericEndpointSpec<FileTransferringMessageHandler<ChannelSftp.LsEntry>> c) {
    ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
    advice.setOnSuccessExpressionString("payload.delete()");
    advice.setOnFailureExpressionString("payload + ' failed to upload'");
    advice.setTrapException(true);
    return advice;
}

@MessagingGateway
public interface UploadGateway {
    @Gateway(requestChannel = "toSftpChannel")
    void upload(File file);
}

1 Ответ

0 голосов
/ 18 октября 2018

Sftp.outboundAdapter() имеет следующие параметры для удаленного каталога:

/**
 * Specify a remote directory path.
 * @param remoteDirectory the remote directory path.
 * @return the current Spec
 */
public S remoteDirectory(String remoteDirectory) {
}

/**
 * Specify a remote directory path SpEL expression.
 * @param remoteDirectoryExpression the remote directory expression
 * @return the current Spec
 */
public S remoteDirectoryExpression(String remoteDirectoryExpression) {
}

/**
 * Specify a remote directory path {@link Function}.
 * @param remoteDirectoryFunction the remote directory {@link Function}
 * @param <P> the expected payload type.
 * @return the current Spec
 */
public <P> S remoteDirectory(Function<Message<P>, String> remoteDirectoryFunction) {
}

Итак, если история о подкаталоге dynamic , вы можете выбрать remoteDirectoryExpressionили remoteDirectory(Function) и вычислите целевой путь для сообщения или какого-либо bean-компонента в контексте приложения.

Например:

.remoteDirectoryExpression("'rootDir/' + headers.subDir")

Также имейте в виду, что для несуществующих каталогов вам необходимо настроить.autoCreateDirectory(true) тоже.

...