使用并行处理的路由异常

时间:2018-09-19 02:10:35

标签: apache-camel

我有三个“等级”的路线:

  • direct:start是“调用” direct:middle的简单路线
  • direct:middle具有多播/ parallelProcessing,正在调用另外两个
  • 其他两条路线(在第三级)都抛出异常

此样本强制这两个最低级别的路由引发异常。 当按如下所示编码时,我看到两个异常(如 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(),这似乎可行,但是我不确定为什么其他方法不起作用。

1 个答案:

答案 0 :(得分:1)

您是正确的。 我得出与您相同的结论(几年前,但我认为情况并没有改变)。实际上,错误/异常处理(更不用说传播)是恕我直言的( the )(在功能上却很强大),但是在Camel中却使人困惑。

根据文档,在路由中不指定任何错误处理程序将使您的路由隐式使用行为为{DefaultErrorHandler

  

默认情况下,路由过程中抛出的任何异常都将被传播   回到呼叫者,交易所立即结束

是的,只要您保持原路! 如果要将异常在子路由(“ direct:middle”)中传播回调用路由(“ direct:start”),则确实必须引入一个

.errorHandler(noErrorHandler() )

现在,对于multicast / split / recipientList EIP,请不要忘记它们正在原始Exchange的副本上运行。副本上的任何错误都不会影响“主”交换。如果需要此功能,请激活“ shareUnitOfWork”(或实施将子交易所上的潜在异常汇总为唯一异常的智能aggregationStrategy)