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