【问题标题】:Exception not propagated to error handler in Apache Camel异常未传播到 Apache Camel 中的错误处理程序
【发布时间】:2013-06-19 15:10:19
【问题描述】:

我有一个定义 doTry-doCatch 块的路由。当在 doCatch 块中处理异常时,我希望将其传播到错误处理程序,以确保在本地处理消息后将消息添加到死信队列。问题是我无法让错误处理程序的传播工作(“调用defaultErrorHandler!”未打印到控制台)。我也尝试过 onException,但也没有运气。

非常感谢任何提示。 问候,奥利弗

protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {

            errorHandler(deadLetterChannel("ref:myDLQ")
                .log("defaultErrorHandler called! ${body}"));

            final RouteDefinition route = from("seda:queue.inbox");

            route               
                .doTry()
                    .process(new Processor() {
                        public void process(Exchange exchange) throws Exception {
                            System.out.println("throwing ex");
                            throw new IllegalArgumentException("test");
                        }
                    })
                .doCatch(Exception.class)
                    .process(new Processor() {
                        public void process(Exchange exchange) throws Exception {
                            System.out.println("handling ex");
                            route.log(LoggingLevel.ERROR, "Exception in route: ${body}");
                            throw new IllegalArgumentException("rethrow");
                        }
                    })
             .log("Received order ${body}")
             .to("mock:queue.order");                               
        }
    };
}

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:

    根据this

    Camel 错误处理已禁用

    当使用 doTry .. doCatch .. doFinally 时,常规的 Camel 错误处理程序不适用。这意味着不会触发任何 onException 或类似事件。原因是 doTry .. doCatch .. doFinally 实际上是它自己的错误处理程序,它旨在模仿 Java 中 try/catch/finally 的工作方式。

    通过我自己的实验,我可以验证 doTry 中发生的任何事情都不会被错误处理程序或异常策略处理。如果要发送到死信通道,则必须在 doCatch 中使用

    .to('uri')
    

    【讨论】:

    • 是的,我也可以确认 :)
    【解决方案2】:

    在 doCatch 中尝试.handled(false)。阅读this

    【讨论】:

    • 我曾尝试使用handled(false)。它已被弃用,也没有工作。但无论如何谢谢:-)。您提供的链接非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 2015-03-29
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多