我有三个“等级”的路线:
此样本强制这两个最低级别的路由引发异常。 当按如下所示编码时,我看到两个异常(如 onException ()中所示打印)
public void configure() throws Exception {
onException().handled(true).log(" --------------- Exception!! -------------------------");
from("direct:start")
.log("Actual start ")
.inOut("direct:middle")
.log(" --------------- Caught Exception -------------------------")
.log("Actual End ");
from("direct:middle")
//.errorHandler(noErrorHandler())
.log("after direct:start body=${body}")
.multicast(new MyAggregationStrategy()).parallelProcessing().stopOnException()
.to("direct:A")
.to("direct:B")
.end();
from("direct:A").errorHandler(noErrorHandler()).process(new ExceptionThrower());
from("direct:B").errorHandler(noErrorHandler()).process(new ExceptionThrower());
}
我 UN 在“ direct:middle”中对 noErrorHandler()进行了注释,认为它可能仍然运行onException(),但只给出一个异常。 相反,它的行为就像在RouteBuilder中未指定onException()一样,将Exception一直抛出给调用者。
我有兴趣了解为什么要这么做。 我尝试在最外层的路由中使用doTry()... doCatch(),这似乎可行,但是我不确定为什么其他方法不起作用。
答案 0 :(得分:1)
您是正确的。 我得出与您相同的结论(几年前,但我认为情况并没有改变)。实际上,错误/异常处理(更不用说传播)是恕我直言的( the )(在功能上却很强大),但是在Camel中却使人困惑。
根据文档,在路由中不指定任何错误处理程序将使您的路由隐式使用行为为{1>的DefaultErrorHandler
默认情况下,路由过程中抛出的任何异常都将被传播 回到呼叫者,交易所立即结束
是的,只要您保持原路! 如果要将异常在子路由(“ direct:middle”)中传播回调用路由(“ direct:start”),则确实必须引入一个
.errorHandler(noErrorHandler() )
现在,对于multicast / split / recipientList EIP,请不要忘记它们正在原始Exchange的副本上运行。副本上的任何错误都不会影响“主”交换。如果需要此功能,请激活“ shareUnitOfWork”(或实施将子交易所上的潜在异常汇总为唯一异常的智能aggregationStrategy)