8

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

  1. 实例化默认的骆驼上下文
  2. 从 spring 上下文中检索 RouteDefinition 列表
  3. 通过调用 ctx.addRouteDefinitions() 将这些定义添加到骆驼上下文
  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();
}  

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

4

4 回答 4

6

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

于 2013-02-15T07:11:31.783 回答
4

对于未来的读者,这是我用于骆驼错误处理的解决方案(这都是 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;
}

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

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();
}

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

于 2016-02-24T21:38:26.440 回答
1

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

于 2013-02-14T23:13:52.087 回答
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
于 2021-05-07T10:01:45.013 回答