【问题标题】:Rename the file after streaming the data from remote directory从远程目录传输数据后重命名文件
【发布时间】:2019-05-15 10:12:51
【问题描述】:

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

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

【问题讨论】:

    标签: spring-integration spring-integration-dsl spring-integration-sftp


    【解决方案1】:

    我也处理过类似的流程。我希望下面的代码可以帮助你。

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

    【讨论】:

      【解决方案2】:

      “遇到麻烦”信息不足;在提出此类问题时,您需要提供实际的错误/堆栈跟踪等。

      也就是说,请参阅the documentation about the advice

      对于成功的情况,发送到successChannel 的消息是AdviceMessage,有效负载是表达式评估的结果。一个名为inputMessage 的附加属性包含发送到处理程序的原始消息。

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

      最后,如果您正在流式传输,在您使用流式传输之前在这里重命名似乎有点为时过早。

      【讨论】:

      • 你说得对,我正在尝试重命名文件,然后再使用它。在流式传输数据后的此集成流程中,我将添加 MV 网关。我如何确保仅在数据流式传输成功时才重命名文件?您能否确认我的理解,因为我正在流式传输数据,一旦我重命名文件,我将不得不关闭流。
      • 您可以在任何读取流的服务上使用建议;就像你在网关上一样。是的,您必须关闭输入流;您还必须关闭 SFTP 会话(在 closeableResource 标头中,如 in the documentation 所讨论的那样。框架组件(FileSplitterStreamTransformer)会自动执行此操作。
      猜你喜欢
      • 1970-01-01
      • 2015-10-08
      • 2019-11-13
      • 1970-01-01
      • 2012-04-26
      • 2016-10-24
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      相关资源
      最近更新 更多