从远程目录流式传输数据后重命名文件

Rename the file after streaming the data from remote directory

我正在使用以下命令读取文件

.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();
    }

"having trouble" 信息不够;提出此类问题时,您需要提供实际的 error/stack 踪迹等。

也就是说,参见 the documentation about the advice

For the successful case, the message sent to the successChannel is an AdviceMessage, with the payload being the result of the expression evaluation. An additional property, called inputMessage, contains the original message sent to the handler.

因此,您在 MV 网关中的表达式需要反映这一点(例如 payload.inputMessage.headers[...]),或者对于 "from" 名称,您的 successExpression 需要将有效负载设置为原始文件名。

最后,如果您正在使用流媒体,那么在您使用流媒体之前在这里重命名似乎有点为时过早。

我也在 kind-off 相同的流程上工作。希望下面的代码对您有所帮助。

.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();