我有一个定义doTry-doCatch块的路由。在doCatch块中处理异常时,我希望将它传播到错误处理程序,以确保在本地处理消息后将消息添加到死信队列中。问题是我无法将传播到错误处理程序中工作(“defaultErrorHandler called!”没有打印到控制台)。我也试过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");
}
};
}
答案 0 :(得分:2)
根据this
禁用Camel错误处理
当使用doTry .. doCatch .. doFinally时,常规的Camel错误处理程序不适用。这意味着任何onException或喜欢不会触发。原因是doTry .. doCatch .. doFinally实际上是它自己的错误处理程序,它的目的是模仿和工作,就像try / catch / finally在Java中的工作方式一样。
根据我自己的实验,我可以验证doTry中发生的任何事情都不会冒泡到错误处理程序或异常策略。如果要发送到死信通道,则必须使用
在doCatch中手动执行此操作.to('uri')
答案 1 :(得分:1)
在doCatch中尝试.handled(false)
。阅读this。