如何处理多个路由中的异常或故障

时间:2012-05-24 05:43:14

标签: apache-camel

处理多个路由之间的异常时遇到一些问题。

作为一个java开发人员的观点,我想将一些常见的逻辑提取到一个公共路由,以便其他路由可以直接调用公共路由而不需要在任何地方都包含公共逻辑。(比如路由版本函数调用)但是当它到来时对于错误处理,我发现它有点棘手。

例如:

//main logic 1
from("direct:route1")
  .doTry()
     .to("direct:common")
  .doCatch(Exception.class)
     .log("Error in route1")
  .end()

//main logic 2
from("direct:route2")
  .doTry()
     .to("direct:common")
  .doCatch(Exception.class)
     .log("Error in route2")
  .end()

//common logic
from("direct:common")
   .to("mock:commonlogic")

问题是当从“mock:commonlogic”端点抛出一些异常时,doTry ...在route1和route2中定义的doCatch块都不会捕获异常。似乎异常只能在通用路由范围内处理。但我想要的是普通路线只是“抛出”异常而“呼叫者”路线自己处理它。有没有办法做到这一点?

由于

2 个答案:

答案 0 :(得分:4)

您需要在公共路由中禁用错误​​处理。然后,从公共路由抛出的任何异常都不会由任何错误处理程序处理,并传播回调用程序路由,该路由具有try .. catch块。

from("direct:common")
   .errorHandler(noErrorHandler())
   .to("mock:commonlogic")

答案 1 :(得分:0)

您可能想要使用exception子句。 http://camel.apache.org/exception-clause.html

像这样(在路由构建器的配置方法中)

// A common error handler for all exceptions. You could also write onException statements for explicit exception types to handle different errors different ways.
onException(Exception.class).to("log:something"); 

from("direct:route1")...;

from("direct:route2")...;

它应该为你做到这一点。

对于当前路由构建器,onException将是全局的。