当前位置: 首页 > 知识库问答 >
问题:

Camel读取文件,并在出现异常时将文件移动到错误文件夹

艾昊明
2023-03-14

我正在使用camel从. csv文件中读取一些记录,用Bindy转换它们并将它们保存在db中。但是,当发生错误时,例如在取消管理或从文件中持久化一行时,我想停止对文件的处理并将其移动到不同的目录。我的路线如下,我使用Spring启动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();

}

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

共有1个答案

白弘伟
2023-03-14

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

文件使用者选项< code>move和< code>moveFailed应该可以满足您的要求。

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

看看你的路线,这应该很好direct路由是同步的内部调用,因此异常会跨路由传播。

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

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

 类似资料:
  • 我试图从一个名为poll.txt的文件中获取数据集,然后使用相关数据。 poll.txt内容: 源代码,选举票.java: 但是,当我运行程序时,在给出异常之前,只使用了其中一行: 我试着在“scanner.nextLine();”语句中移动,但没有用。如果我不要求nextLine,这个程序运行良好,但我显然需要它,而且我似乎不知道出了什么问题。

  • 问题内容: 在尝试使用apache poi读取Excel 2007文件.xlsx文件扩展时出现问题: 此行请给我一个例外 ,什么原因可能导致此错误? 问题答案: 您需要在类路径中包含一个名为“ your_location_of_poi \ poi-xx \ ooxml-lib \” 的jar文件 。 注意:是您正在使用的poi的版本,并且是上述文件夹下该jar文件的版本号

  • 我知道为什么会出现错误:这是因为我想读取数据的表(Htest)为null。 我检查了我的excel,有一张正确名称为“htest”的表。 我还检查了工作簿中的工作表数。它返回工作簿的正确页数 我不知道为什么工作簿中的工作表是可用的,但代码返回null??我错过了什么?有人有同样的问题吗?或者你能给我一个提示来使用它吗? 谢谢你。 错误是:

  • 问题内容: 我正在使用Java在Linux EXTREME VPS上存储图像 当我将其存储在服务器路径上时 使用以下代码读取路径 当我使用上面的代码阅读时,我得到以下异常 如何解决这个问题呢? 还有其他从Linux服务器读取文件的方法吗? 问题答案: 我认为问题在于您使用的文件路径错误。 您说您正在Linux服务器上读取文件,似乎您正在尝试在Windows计算机上读取文件。由此推断,您已将Linu

  • 我正在实现一个从s3获取文件、读取并删除它的路由。问题是删除后继续搜索文件并进入错误,我不明白为什么路由不停止。 这是我的