为camel配置全局错误处理程序?

时间:2013-02-14 21:59:13

标签: apache-camel

我正在尝试为我的camel上下文中的所有路由抛出的所有异常配置异常处理程序。我的方法如下,没有运气:

  1. 实例化默认的驼峰上下文
  2. 从弹簧上下文中检索RouteDefinition列表
  3. 通过调用ctx.addRouteDefinitions()
  4. 将这些定义添加到camel上下文中
  5. 从java dsl定义的RotueBuilder添加我的异常处理程序路由(ctx.addRoutes(new MyErrorHandlerRouteBuilder())
  6. 启动驼峰上下文
  7. 此时,在spring中定义的路由中抛出的异常由DefaultErrorHandler处理,而不是我想要定义的那个。这是我的错误处理路由定义的样子

    public class MyErrorHandlerRouteBuilder extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        onException(Exception.class)
            .routeId("errorHandlerRoute")
            .handled(true)
            .process(new Processor() {
    
                @Override
                public void process(Exchange exchange) throws Exception {
                    Throwable caused = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class);
                    // do some custom processing of the exception
                }
            })
            .stop();
    }  
    

    我还能尝试什么,或者我哪里出错?

4 个答案:

答案 0 :(得分:3)

创建一个抽象基类,并在configure方法中定义全局错误处理程序。然后在你的路由类中扩展这个基类,并在它们的configure方法中首先调用super.configure()。

答案 1 :(得分:2)

对于未来的读者,这是我用于骆驼错误处理的解决方案(这是所有java配置,但它将作为spring xml工作):

1)设置DeadLetterChannelBuilder Bean

@Bean
public DeadLetterChannelBuilder myErrorHandler() {
    DeadLetterChannelBuilder deadLetterChannelBuilder = new DeadLetterChannelBuilder();
    deadLetterChannelBuilder.setDeadLetterUri("direct:error");
    deadLetterChannelBuilder.setRedeliveryPolicy(new RedeliveryPolicy().disableRedelivery());
    deadLetterChannelBuilder.useOriginalMessage();
    return deadLetterChannelBuilder;
}

现在这个bean将负责获取错误并将它们指向direct:error URI。

2)设置错误处理路径

您需要一个路由来侦听URI direct:error,因为这是您的错误现在被路由的地方。

@Override
public void configure() throws Exception {
    from("direct:error")
            .to("log:error")
            .end();
}

正如您现在所看到的,所有错误都被路由到上述路由,您可以灵活地全局实现复杂的错误处理逻辑。

3)将全局错误处理程序注入路径

您仍需要将错误处理bean注入每个路由。我希望骆驼会自动处理这个,但我还没找到办法。虽然使用这种方法,代码重复/开销很小。

@Override
public void configure() throws Exception {
    errorHandler(myErrorHandler)
    from("myStartingUri")
            .to("myEndDestination")
            .end();
}

查看基于spring xml的配置文档,我认为您需要在路由定义中添加<route errorHandlerRef="myErrorHandler">

答案 2 :(得分:1)

错误处理程序是Java DSL中特定于路径构建器的。您需要为每个路由构建器创建一个。或者在您的情况下,您需要在Spring DSL中定义它(因为您似乎在Spring中定义了路由)。

答案 3 :(得分:0)

从应用程序上下文中检索作为资源的 XML 路由并将它们加载到骆驼上下文后,您将拥有一个 RoutesDefinition 对象,您可以尝试像这样操作

Resource xmlRoutes = applicationContext.getResource("path/to/xml/routes");
RoutesDefinition routeDefinitions = camelContext.loadRoutesDefinition(xmlRoute.getInputStream());
for (RouteDefinition routeDefinition : routeDefinitions.getRoutes()) {
    routeDefinition
        .onException(Exception.class)
        .handled(true)
        // do some custom processing of the exception