camel读取文件并在异常情况下将文件移动到错误文件夹

siv3szwd  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(363)

我正在使用camel从.csv文件中读取一些记录,用bindy转换它们并将它们保存在db中。但是,当出现错误时(例如取消显示或保留文件中的行时),我希望停止处理文件并将其移动到其他目录。我的路线如下,我使用的是SpringBootCamel3.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();

}

到目前为止,当发生异常时,处理停止,但文件不会移动到错误目录,而是移动到已成功处理的文件所在的目录?如果有任何帮助,我将不胜感激。提前谢谢。

dw1jzc5e

dw1jzc5e1#

你试过删除你的错误处理程序吗?
文件使用者选项 move 以及 moveFailed 你应该做你想做的。
当文件使用者接收到异常时,它会将文件移动到 moveFailed 位置,否则将移动到标准位置 move 位置。
看看你的路线,这应该行得通。 direct 路由是同步的内部调用,因此异常会跨路由传播。
但是,错误处理程序会捕获任何异常( Exception.class )同时也处理它们( handled(true) ).
因此,文件使用者不再接收异常。它假定处理成功并将文件移动到标准 move 位置。

相关问题