代码之家  ›  专栏  ›  技术社区  ›  Ermintar

camel docatch和onexception优先级

  •  2
  • Ermintar  · 技术社区  · 6 年前

    我有一个特定路由的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()和要执行的日志和pocessing操作中捕获异常。 但是,改为调用onexception()。

    onexception()是否具有更高的优先级?据我所知,本地捕捞更为优先。

    p.s.删除onexception()将调用docatch()。但是我有理由保留这两个。 camel版本是:org.apache.camel:camel cxf:2.21.0.000033-fuse-000001-redhat-1

    2 回复  |  直到 6 年前
        1
  •  2
  •   Claus Ibsen    6 年前

    当你有点多事…Docatch Block,然后您调用另一个路由,例如您通过

    .to("direct:internalroute")
    

    然后你需要关闭该路线上的错误处理(如

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

    如果您希望所有错误处理都通过dotry..仅限Docatch块。

        2
  •  2
  •   TacheDeChoco    6 年前

    这不是一个优先权的问题,而是一个设计/实现的问题。参见DOC:

    “onexception子句是一种捕获机制,而不是 捕捉异常。也就是说,一旦定义了onexception子句, 它捕获在路由中任何一点发生的异常。”