如果在单独的类中定义异常子句,Camel 异常处理将不起作用

2023-11-23

我正在尝试构建一个具有多个骆驼路线的应用程序,这些路线在内部重用许多常见路线。 因此,我尝试将路由分隔在几个不同的路由生成器类中,然后在需要的地方连接路由。

例如,与发送电子邮件有关的所有路由都进入 EmailRouteBuilder 类,而处理特定 JMS 队列的所有路由都进入 MyQueueRouteBuilder 类。 我想这应该没问题,因为 Camel 不区分类,只查找路由定义。

此外,我还将几个异常处理路由分组到一个单独的 ExceptionHandlingRouteBuilder 中。

我还通过在 Spring 中定义骆驼上下文将所有不同的类连接在一起,如下所示 -

<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring">
    <propertyPlaceholder id="properties" location="classpath:${env}/autoimport.properties"/>
    <!-- Common Routes -->
    <routeBuilder ref="emailRouteBuilder" />
    <routeBuilder ref="myQueueRouteBuilder" />
  <routeBuilder ref="httpRouteBuilder" />
    <routeBuilder ref="exceptionsRouteBuilder" />
    <routeBuilder ref="customer1RouteBuilder" />
    <routeBuilder ref="customer2RouteBuilder" />

</camelContext>

我的 exceptsRou​​teBuilder 包含许多异常子句,例如 -

onException(ConnectException.class)
            .routeId("connectExceptionEP")
            .handled(true)
            .log("Caught Exception: ")
            .to("direct:gracefulExit");

..
..
..

但是,在另一个类中定义异常,或者在主路由定义之外单独定义异常,似乎存在问题。

我通过查找正在启动的路由(通过routeId)并检查何时抛出异常,在日志中验证了这一点。

此外,为了进一步确认,我采用了 http Connect 异常处理路线并将其直接放入 httpRouteBuilder 中,瞧……! ,现在异常处理就可以很好地处理这个异常了。

我是否在这里遗漏了一些东西,让所有异常都能正常工作,同时在自己的类中得到很好的定义。 ?

我正在使用 Apache Camel 2.9.0 ,但我也在 2.8.3 中验证了相同的行为。

谢谢, 阿南德


正确, onException() 子句仅适用于当前 RouteBuilder 的路由定义...

也就是说,您可以通过让所有 RouteBuilder 扩展 ExceptionRouteBuilder 并调用 super.configure() 来重用这些定义...类似这样

public class MyRouteBuilder extends ExceptionRouteBuilder {
    @Override
    public void configure() throws Exception {
        super.configure();
        from("direct:start").throwException(new Exception("error"));
    }
}
...
public class ExceptionRouteBuilder implements RouteBuilder {
    @Override
    public void configure() throws Exception {
        onException(Exception.class).handled(true).to("mock:error");
    }
}

或者甚至只是在 ExceptionBuilder 类中使用静态方法来为给定的 RouteBuilder 实例设置子句

public class MyRouteBuilder extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        ExceptionBuilder.setup(this);
        from("direct:start").throwException(new Exception("error"));
    }
}
...
public class ExceptionBuilder {
    public static void setup(RouteBuilder routeBuilder) {
        routeBuilder.onException(Exception.class).handled(true).to("mock:error");
    }  
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果在单独的类中定义异常子句,Camel 异常处理将不起作用 的相关文章

随机推荐