Ana*_*ige 8 routes exception apache-camel
我正在尝试构建一个具有多个camel路由的应用程序,这些路由在内部重用了许多常用路由.因此,我试图在几个不同的Route Builder类中隔离路由,然后在需要的地方连接路由.
例如,所有与发送电子邮件有关的路由都进入EmailRouteBuilder类,所有处理特定JMS队列的路由都进入MyQueueRouteBuilder类.我认为这应该没问题,因为Camel不区分类,只查找路由定义.
另外,我还将几个异常处理路由分组到一个单独的ExceptionHandlingRouteBuilder中.
我也通过在Spring中定义camel context来连接所有不同的类,如此 -
<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>
Run Code Online (Sandbox Code Playgroud)
我的例外路由器包含许多例外条款,如 -
onException(ConnectException.class)
.routeId("connectExceptionEP")
.handled(true)
.log("Caught Exception: ")
.to("direct:gracefulExit");
..
..
..
Run Code Online (Sandbox Code Playgroud)
但是,看起来在另一个类中定义的异常存在问题,或者就此而言,在主路由定义中单独定义.
我通过查找正在引导的路由(通过routeId)并在检查何时抛出异常时在日志中验证了这一点.
另外,为了进一步确认,我采用了http Connect异常处理路由并将其直接放在httpRouteBuilder中并且... ..!,异常处理现在可以解决这个异常.
我在这里错过了一些东西,以便在其自己的类中很好地定义所有异常.?
我正在使用Apache Camel 2.9.0,但我在2.8.3中也验证了相同的行为.
谢谢,阿南德
Ben*_*Day 12
更正,onException()子句仅适用于当前RouteBuilder的路由定义...
也就是说,您可以通过让所有RouteBuilders扩展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");
}
}
Run Code Online (Sandbox Code Playgroud)
或者甚至只是在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");
}
}
Run Code Online (Sandbox Code Playgroud)