Переименуйте файл после потоковой передачи данных из удаленного каталога

Я читаю файл, используя команду ниже

.handle(Sftp.outboundGateway(sftpSessionFactory(), GET,"payload.remoteDirectory + payload.filename").options(STREAM))

Как только данные передаются в поток, у меня есть совет, как справиться с успехом и неудачей. Я хочу переименовать файл в случае успеха, Я столкнулся с проблемой при переименовании удаленного файла. Я хочу переименовать файл и после этого выполнить обработку ошибок, используя аналогичный совет.

.handle(service(), e -> e.advice(after()))

 @Bean
    public ExpressionEvaluatingRequestHandlerAdvice after() {
        ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
        advice.setSuccessChannelName("success.input");
        advice.setOnSuccessExpressionString("payload + ' was successful'");
        advice.setFailureChannelName("failure.input");
        advice.setOnFailureExpressionString("payload + ' was bad, with reason: ' + #exception.cause.message");
        advice.setTrapException(true);
        return advice;
    }



@Bean
    public IntegrationFlow success() {
        return f -> f.handle(Sftp.outboundGateway(sftpSessionFactory(), MV, "payload").renameExpression("headers[file_renameTo]='gileName_read'")).log();
    }

person David    schedule 15.05.2019    source источник


Ответы (2)


Я также работал над подобным же потоком. Я надеюсь, что приведенный ниже код может вам помочь.

.handle(service(), e -> e.advice(after()))
                .enrichHeaders(h -> h
                        .headerExpression(FileHeaders.RENAME_TO, "headers[file_remoteDirectory]+'archive/' + headers[file_remoteFile]")
                        .headerExpression(FileHeaders.REMOTE_FILE, "headers[file_remoteFile]")
                        .header(FileHeaders.REMOTE_DIRECTORY, "headers[file_remoteDirectory]"))
                .handle(Sftp.outboundGateway(sftpSessionFactory(), MV, "headers[file_remoteDirectory]+headers[file_remoteFile]").renameExpression("headers['file_renameTo']"))
                .get();
person Sahil    schedule 19.05.2019

"иметь проблемы" - недостаточно информации; вам необходимо предоставить фактическую трассировку ошибок / стека и т. д., задавая такие вопросы.

При этом см. документацию по совету.

В успешном случае сообщение, отправленное в successChannel, представляет собой AdviceMessage, а полезная нагрузка является результатом оценки выражения. Дополнительное свойство, называемое inputMessage, содержит исходное сообщение, отправленное обработчику.

Итак, ваши выражения в шлюзе MV должны это отражать (например, payload.inputMessage.headers[...]) или, для имени "from", ваш successExpression должен установить полезную нагрузку на исходное имя файла.

Наконец, если вы ведете потоковую передачу, переименовывать здесь до того, как вы израсходуете поток, кажется преждевременным.

person Gary Russell    schedule 15.05.2019
comment
Вы правы, я пытаюсь переименовать файл перед его использованием. В этом потоке интеграции после потоковой передачи данных я добавлю шлюз MV. Как я могу убедиться, что файл переименовывается только в случае успешной потоковой передачи данных? и не могли бы вы подтвердить мое понимание того, что, поскольку я транслирую данные, мне придется закрыть поток после того, как я переименовал файл. - person David; 15.05.2019
comment
Вы можете воспользоваться советом для любой имеющейся у вас службы, которая читает поток; точно так же, как у вас он был на шлюзе. Да, вы должны закрыть входной поток; вы также должны закрыть сеанс SFTP (в заголовке closeableResource, как обсуждалось в документации. Компоненты фреймворка (FileSplitter, StreamTransformer) делают это автоматически. - person Gary Russell; 16.05.2019