Camel - 如何定义errorHandler并使用includeRoutes?

时间:2014-11-19 09:47:43

标签: apache-camel

我在子类中定义路线并将其与RouteBuilder一起放在includeRoutes()中。现在我想插入一个默认的ErrorHandler,但是我得到了错误信息:

errorHandler must be defined before any routes in the RouteBuilder

这是我的代码:

public class defaultRoutes extends RouteBuilder {
    public void configure() throws Exception {
        errorHandler(deadLetterChannel("direct:deadLetter").maximumRedeliveries(3));

        from("direct:deadLetter").id("deadLetter")
            .errorHandler(defaultErrorHandler().disableRedelivery())
            .log("${exception.stacktrace}")
            .setHeader("ErrorMessage",simple("${exception}",String.class))
            .setHeader("ErrorStacktrace",simple("${exception.stacktrace}",String.class))
            .to("activemqWithoutTransactions:errors");

        ...
        ...
        for(String Module: globalConfig.getLoadedModules()) {
            ...
            includeRoutes(routes);
        }
        ...
    }

我也测试了这个:

public class defaultRoutes extends RouteBuilder {
    public void configure() throws Exception {

        RouteBuilder errorHandler = new RouteBuilder() {
            public void configure() {
                errorHandler(deadLetterChannel("direct:deadLetter").maximumRedeliveries(3));
                from("direct:deadLetter").id("deadLetter")
                    .errorHandler(defaultErrorHandler().disableRedelivery())
                    .log("${exception.stacktrace}")
                    .setHeader("ErrorMessage",simple("${exception}",String.class))
                    .setHeader("ErrorStacktrace",simple("${exception.stacktrace}",String.class))
                    .to("activemqWithoutTransactions:errors");
            }
        };
        includeRoutes(errorHandler);
        ...
        ...
        for(String Module: globalConfig.getLoadedModules()) {
            ...
            includeRoutes(routes);
        }
        ...
    }

但是这个抛出同样的错误信息!我该怎么做才能让ErrorHandler工作?

谢谢

2 个答案:

答案 0 :(得分:0)

我认为您的问题在问题https://issues.apache.org/jira/browse/CAMEL-5612的评论中有所描述。

如果使用全局范围的errorHandler,则必须确保它应该像 以下:

  • 的ErrorHandler
  • 的ErrorHandler
  • 路线
  • 路线

而不是:

  • 的ErrorHandler
  • 路线
  • 的ErrorHandler
  • 路线
亲切的问候, soilworker

答案 1 :(得分:0)

尝试从路线中删除.errorHandler()行:

   from("direct:deadLetter").id("deadLetter")
        .errorHandler(defaultErrorHandler().disableRedelivery()) // this is incorrect
        .log("${exception.stacktrace}")
        .setHeader("ErrorMessage",simple("${exception}",String.class))
        .setHeader("ErrorStacktrace",simple("${exception.stacktrace}",String.class))
        .to("activemqWithoutTransactions:errors");

检查this page以获取有关Camel中死信频道的更多用法示例。