Camel doCatch和onException优先级

时间:2018-06-15 15:45:56

标签: java apache-camel spring-camel

我有一个带有doTry()的路由 - 一般用于特定路由的doCatch()对和onException()。

onException(Exception.class)
    .handled(true)
    .log(LoggingLevel.ERROR, "An error occurred: ${exception.stacktrace}")
    .setBody(simple("${exception}"))
    .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(500));

from("direct:mydirect")
        .routeId("myRoute")
        .doTry()
           .to("direct:internalroute")
        .doCatch(Exception.class)
            .log(LoggingLevel.ERROR, "EXCEPTION: ${exception.stacktrace}")
            .process(exceptionHandlerProcessor)
            .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(500))
            .marshal(new JsonDataFormat(JsonLibrary.Jackson))
        .doFinally()
            .log("FINALLY")
        .endDoTry();

内部路由抛出一个普通的java.lang.Exception

 throw new Exception("Catch me if you can!");

我希望在doCatch()中捕获异常,并执行日志记录和处理操作。 但是,会调用onException()。

onException()的优先级是否更高?根据我的理解,本地捕捞更优先。

P.S。删除onException()会调用doCatch()。但是我有理由保留两者。 Camel版本是:org.apache.camel:camel-cxf:2.21.0.000033-fuse-000001-redhat-1

2 个答案:

答案 0 :(得分:2)

恕我直言,这不是优先问题,而是设计/实施问题。请参阅doc:

  

" onException子句是一种陷阱机制,而不是   捕捉异常。也就是说,一旦定义了onException子句,   它捕获路线中任何一点发生的异常"

答案 1 :(得分:2)

当你有一个doTry .. doCatch块并且你调用另一条路线时,例如你通过

.to("direct:internalroute")

然后您需要关闭该路线上的错误处理,例如

from("direct:internalroute")
  .errorHandler(noErrorHandler())

如果您希望所有错误处理仅通过doTry .. doCatch块发生。