3

我有一个定义 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");                               
        }
    };
}
4

2 回答 2

2

据此_

骆驼错误处理已禁用

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

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

.to('uri')
于 2013-07-31T14:22:46.947 回答
1

.handled(false)在 doCatch 中尝试。读这个

于 2013-06-19T21:25:57.833 回答