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

Jos*_*iah 6 apache-camel

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

  1. 实例化默认的驼峰上下文
  2. 从spring上下文中检索RouteDefinition列表
  3. 通过调用ctx.addRouteDefinitions()将这些定义添加到camel上下文中
  4. 从java dsl定义的RotueBuilder添加我的异常处理程序路由(ctx.addRoutes(new MyErrorHandlerRouteBuilder())
  5. 启动驼峰上下文

此时,在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();
}  
Run Code Online (Sandbox Code Playgroud)

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

小智 7

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

1)设置一个DeadLetterChannelBuilderBean

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

现在这个 bean 将负责拾取错误并将它们定向到direct:errorURI。

2) 设置错误处理路径

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

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

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

3)将全局错误处理程序注入到您的路由中

您仍然需要将错误处理 bean 注入到每个路由中。我希望骆驼能自动处理这个问题,但我还没有找到办法。尽管使用这种方法,代码重复/开销是最小的。

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

查看基于 springs xml 的配置的文档,我认为您需要放入<route errorHandlerRef="myErrorHandler">路由定义。


Cla*_*sen 5

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

  • 2 年后有没有更好的方法可以做到这一点,还是我需要等待 Camel 3.x? (2认同)

Pet*_*der 1

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