如何处理Camel中的故障转移负载均衡器故障?

aho*_*hor 5 java apache-camel

如何捕获导致Camel故障转移负载均衡器失败的最终异常(例如,准备好(HTTP)响应而不是普通堆栈跟踪)?

我有这样的事情:

from("jetty:http://0.0.0.0:8081/context")
  .process(frontendProcessor)
  .loadBalance()
    .failover(1,
              false,
              true,
              true,
              MyFancyException.class)
    .to("direct:foo", "direct:bar")
    .end()
  .process(responseProcessor)
  .stop();
Run Code Online (Sandbox Code Playgroud)

有:

from("direct:foo")
  .process(potentiallyThrowingMyFancyException);
Run Code Online (Sandbox Code Playgroud)

(对于"direct:bar"完全相同)

如果没有负载平衡,我会继续使用,onException但我似乎无法理解它如何与负载均衡器及其内部异常处理很好地协同工作.一方面,我想记录堆栈跟踪DURING负载平衡,另一方面我想onException用来创建一个很好的错误响应 - 理想情况下都在同一个组件/实现中.

所以我尝试了这个:

onException(Exception.class)
  .process(myErrorProcessor)
  .handled(true)
  .stop();

from("jetty:http://0.0.0.0:8081/context")
  .process(frontendProcessor)
  .loadBalance()
    .failover(1,
              false,
              true,
              true,
              MyFancyException.class)
    .to("direct:foo", "direct:bar")
    .end()
  .process(responseProcessor)
  .stop();
Run Code Online (Sandbox Code Playgroud)

handled(true)似乎打破了故障转移,而另一方面,我认为当我onException用于渲染最终的HTTP错误响应时,它是必要的.

如何区分onException错误处理器:

  1. 发生异常,触发故障转移,和

  2. 故障转移负载均衡器完全失败,您可能想为调用者创建一个不错的最终错误响应?

Lau*_*bot 2

我自己更像是一个doTry...doCatch 的人:-)

您可以将 loadBalance EIP 包含在 doTry...doCatch 中,并根据需要处理其中的最终异常。对于中间异常也是如此:在from("direct:foo")from("direct:bar")路由中使用 doTry...doCatch 并根据需要对捕获的异常进行操作。当然,不要忘记事后重新扔掉它们。