【问题标题】:Move files based on exception class to a different folder with camel使用骆驼将基于异常类的文件移动到不同的文件夹
【发布时间】:2017-06-19 14:39:51
【问题描述】:

如何根据错误将FTP路由中的文件移动到不同的目录?

from("sftp://XXX@safsdf.de/dir/?delay=2s&move=done&moveFailed=failImport")
        .split()
        .body()
        .process(e -> {
            String fileName = (String) e.getIn().getHeader(Exchange.FILE_NAME);
             // do some magic which could throw a exception
        })
        .log("Imported file ${file:name} completely.");

【问题讨论】:

    标签: java ftp apache-camel camel-ftp


    【解决方案1】:

    查看 Camel 中的 onException 处理程序。它允许您捕获特定的异常,然后进行相应的路由。如果您希望错误处理更符合您的 Camel 路线,还有类似 try-catch 的语法。

    onException(BadThingHappenedException.class).to(file:///errorFolder)
    

    文档:

    onException

    try-catch-finally

    Custom file processing strategy

    【讨论】:

    • 我必须再次使用to中的整个sftp配置吗?
    • 似乎原始文件也没有被删除/移动。
    • 1.是的,如果您想将文件移动到远程系统上的另一个文件夹,您可以在“to”中指定另一个 sftp://
    • 2.查看 Camel FTP2 文档中的 delete=true 标志:camel.apache.org/ftp2.html
    • 但是使用这种组合会导致文件存储在/errorFolder 和/done 中。发生此类错误时,我不想将文件存储在failImportdone
    【解决方案2】:

    我可以使用 onException、try-catch-finally 或自定义文件处理策略进行归档,但它们都不是很方便。

    我想出了这个简单的代码:

    @Override
    public void configure() throws Exception {
        errorHandler(loggingErrorHandler(logger));
        from("sftp://XXX@safsdf.de/dir/?delay=2s&move=${in.header.outDirectory}&moveFailed=failImport")
                .process(exchange -> exchange.setProperty(originalMessage, exchange.getIn()))
                .split()
                .body()
                .process(e -> {
                    String fileName = (String) e.getIn().getHeader(Exchange.FILE_NAME);
                    Message origMsg = (Message) e.getProperty(originalMessage);
                    try {
                        // do what ever
                        origMsg.setHeader(outDirectory, "done/" + fileName);
                    } catch (KaboomException ex) {
                        origMsg.setHeader(outDirectory, "retry/" + fileName);
                    }
                })
                .log("Imported file ${file:name} completely.");
    
    }
    

    在原始邮件上设置标题很重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多