我试图在全局onException中捕获自己的异常。在捕获到Jaxb异常后,我抛出了Exception。但是,CustomException不会被onException捕获

onException(Exception.class)
    .handled(true)
    .log("Globally Caught CustomException")
    .end();

from("start:direct")
    .doTry()
        .unmarshal(soapMessage)
    .doCatch(JAXBException.class)
        .log("Locally Caught JAXBException")
        .throwException(new CustomException()
    .endDoTry();

最佳答案

根据https://people.apache.org/~dkulp/camel/try-catch-finally.html(请参阅禁用骆驼错误处理一节),当使用doTry .. doCatch .. doFinally时,骆驼错误处理程序不适用。因此,不会触发任何OnException

如果要使用OnException捕获异常,则应直接将其引发,而不要放在DoTry .. DoCatch内部。现在您可能会想到创建两个onException,一个处理Exception.class,另一个处理JAXBException.class

onException(Exception.class)
            .handled(true)
            .log("Globally Caught CustomException")
            .end();
onException(JAXBException.class)
            .handled(true)
            .throwException(new CustomException())
            .end();


但是第一个onException不会再次被调用,因为Camel在已经处理错误的同时不允许进一步的错误处理。这是由org.apache.camel.processor.FataFallbackErrorHandler完成的,它捕获新的异常,记录警告,将其设置为Exchange上的异常,并停止任何进一步的路由(Camel In Action,第二版)。

08-18 09:40