【问题标题】:Camel Reading file and on exception move file to error folder骆驼读取文件和异常将文件移动到错误文件夹
【发布时间】:2021-01-02 13:25:22
【问题描述】:

我正在使用骆驼从 .csv 文件中读取一些记录,用 bindy 转换它们并将它们保存在数据库中。但是,当发生错误时,例如在 unmanshalling 或从文件中保留一行时,我想停止处理文件并将其移动到不同的目录。 我的路线如下,我使用的是spring boot camel 3.7版本

onException(Exception.class)
            .handled(true)
            .log(LoggingLevel.INFO, "${file:name}")
            .log("IOException occurred due: ${exception.message}")
            .useOriginalMessage()
            .toD("file://".concat(targetErrorLocation).concat("/${file:name}"))
            .end();


    from(buildPathUrl())
            .transacted()
            .log(LoggingLevel.INFO, "${file:name}")
            .choice()
            .when(header("CamelFileName").contains("ORDER"))
            .log(LoggingLevel.INFO, "Order file")
            .to("direct:orderRoute")
            .when(header("CamelFileName").contains("TRANSACTIONS"))
            .log(LoggingLevel.INFO, "Transaction file")
            .to("direct:transactionRoute")
            .when(header("CamelFileName").contains("BATCH"))
            .log(LoggingLevel.INFO, "Shipment batch file")
            .to("direct:shipBatchRoute")
            .otherwise()
            .log(LoggingLevel.INFO, "Shipment file")
            .to("direct:shipmentRoute");


    from("direct:orderRoute")
            .log(LoggingLevel.INFO, "${body}")
            .unmarshal(orderCsvDataFormat)
            .log(LoggingLevel.INFO, "${file:name}")
            .split(body())
            .streaming()
            .shareUnitOfWork()
            .log(LoggingLevel.INFO, "${body}")
            .to("bean:ordersService?method=persistOrder")
            .end();

   private String buildPathUrl() {
    StringBuilder stringBuilder = new StringBuilder("file://");
    stringBuilder.append(sourceLocation)
            .append("?move=")
            .append(targetLocation)
            .append("/")
            .append("${file:name}")
           /* .append(AMPERSAND)
            .append("bridgeErrorHandler=true")*/
            .append(AMPERSAND)
            .append("moveFailed=error/${file:name}")
            /*.append(AMPERSAND)
            .append("delete=true")*/;

    return stringBuilder.toString();

}

到目前为止,当发生异常时,处理会停止,但文件不会移动到错误目录 但它被移动到成功处理的文件也被移动的目录? 我将不胜感激任何帮助。提前致谢。

【问题讨论】:

    标签: java spring-boot apache-camel spring-camel


    【解决方案1】:

    您是否尝试过仅删除您的错误处理程序

    文件使用者选项movemoveFailed 应该可以满足您的需求。

    文件使用者收到异常时,会将文件移动到moveFailed 位置,否则将移动到标准move 位置。

    查看您的路线,这应该可以正常工作。 direct 路由是同步内部调用,因此异常会跨路由传播。

    但是,您的错误处理程序会捕获任何异常 (Exception.class) 并处理它们 (handled(true))。

    因此,文件使用者不再收到异常。它假定处理成功并将文件移动到标准move 位置。

    【讨论】:

    • 非常感谢您的回答。如果由于文件组件的可靠性特性而删除了错误处理程序,则会重新发送交换,从而导致无限循环,并且文件不会再次移动到“moveFailed”位置。我已经尝试了 move 和 moveFailed 属性,并且在异常处理程序中我只是记录了异常以避免无限循环,但是文件一直在“move”位置而不是“moveFailed”中移动。我相信 moveFailed 在 e.x 读取文件时发生错误时起作用,而不是在处理路由步骤的后续步骤中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多