如果在单独的类中定义了Exception子句,则骆驼异常处理将不起作用

如果在单独的类中定义了Exception子句,则骆驼异常处理将不起作用,exception,routes,apache-camel,Exception,Routes,Apache Camel,我正在尝试构建一个应用程序,其中包含多条骆驼路线,这些路线在内部重复使用许多常用路线。 因此,我尝试在几个不同的管线生成器类中分离管线,然后在需要的地方连接管线 例如,所有与发送电子邮件有关的路由都进入EmailRouteBuilder类,所有处理特定JMS队列的路由都进入MyQueueRouteBuilder类。 我想这应该没问题,因为Camel不区分类,只查找路由定义 此外,我还将几个异常处理路由分组到一个单独的ExceptionHandlingRouteBuilder中 我还通过在Spri

我正在尝试构建一个应用程序,其中包含多条骆驼路线,这些路线在内部重复使用许多常用路线。 因此,我尝试在几个不同的管线生成器类中分离管线,然后在需要的地方连接管线

例如,所有与发送电子邮件有关的路由都进入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>
但是,在另一个类中定义异常,或者在主路由定义之外单独定义异常,这似乎是一个问题

我在日志中通过查找正在引导的路由(通过routeId)并检查何时引发异常来验证这一点

此外,为了进一步确认,我采用了http Connect异常处理路由,并将其直接放入httpRouteBuilder和lo中,对于此异常,异常处理现在可以正常工作

在这里,我是否遗漏了一些可以让所有异常在自己的类中很好地定义的东西

我使用的是ApacheCamel 2.9.0,但我在2.8.3中也验证了相同的行为

谢谢, A正确,OneException()子句仅适用于当前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");
    }  
}

根据公认的答案,我找到了一种更干净的方法来实现异常处理,因此您不必在每个路由中调用super.configure()。只需在基类的构造函数中调用一个处理OneException的方法

//Base class that does exception handling
public abstracExceptionRouteBuildert class BaseAbstractRoute extends RouteBuilder {
  protected BaseAbstractRoute() {
    handleException();
  }

  private void handleException() {
    onException(Exception.class).handled(true).to("mock:error");
  }
}

//Extend the base class
public class MyRouteBuilder extends BaseAbstractRoute {
  @Override
  public void configure() throws Exception {
    from("direct:start").throwException(new Exception("error"));
  }
}

好提示!我一直在绞尽脑汁想为什么OneException没有被触发。
//Base class that does exception handling
public abstracExceptionRouteBuildert class BaseAbstractRoute extends RouteBuilder {
  protected BaseAbstractRoute() {
    handleException();
  }

  private void handleException() {
    onException(Exception.class).handled(true).to("mock:error");
  }
}

//Extend the base class
public class MyRouteBuilder extends BaseAbstractRoute {
  @Override
  public void configure() throws Exception {
    from("direct:start").throwException(new Exception("error"));
  }
}