首页 > 解决方案 > doTry/doCatch 和全局 onException 行为

问题描述

我注意到在成功处理后不再调用doTry/doCatch全局处理程序。onException这是我的示例代码:

<doTry>
    <to uri="direct:triggerError"/>
    <doCatch>
        <exception>com.foo.bar.MyException</exception>
        <log message="IN DOCATCH"/>
    </doCatch>
    <doFinally>
        <log message="IN FINALLY"/>
    </doFinally>
</doTry>

<throwException message="Now handle it in global handler" exceptionType="com.foo.bar.MyOtherException"/>

在我的骆驼背景下,我有这个:

<onException>
    <exception>com.foo.bar.MyOtherException</exception>
    <handled>
        <constant>true</constant>
    </handled>
    <log message="HANDLING MY OTHER EXCEPTION"/>
    <to uri="direct:commonAPIErrorProcessor"/>
</onException>

我观察到异常被正确捕获doCatch并被doFinally调用,但onException从未调用全局,我得到一个堆栈跟踪作为响应。我该如何解决?我用 Camel 3.4.0 和 3.7.0 试了一下,结果一样。

标签: apache-camel

解决方案


您的示例中的问题是您doTry. 无论您使用 XML 还是 Java DSL,这似乎都让 Camel 感到困惑(在这两种 DSL 中效果相同)。

只要您在 中使用简单的“语句” doTry,一切都会完美无缺。当您调用另一条路线时,正如您所描述的那样非常混乱。

Camel 捕获了另一条路由抛出的异常,但之后错误处理程序保持“禁用”状态。似乎Camel 失去了doTry作用域,因此永远不会完成由doTry.

因此,我假设“路由跳转”不是doTry/doCatch的预期用例。由于它覆盖了正常的错误处理,它可能应该只在路由中非常局部地使用。


推荐阅读