我如何捕获导致 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();
与:
from("direct:foo")
.process(potentiallyThrowingMyFancyException);
(与“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();
但是 handled(true)
似乎中断了故障转移,而另一方面,我认为当我使用 onException
来呈现最终的 HTTP 错误响应时这是必要的。
我如何在 onException
错误处理器中区分:
发生了触发故障转移的异常,并且
故障转移负载均衡器完全失败,您可能想为调用者创建一个不错的最终错误响应?
最佳答案
我最终使用了 Laurent 在他的回答中提到的相同方法。我将发布解决方案以获得完整示例,但接受他的回答。
请注意他的回答中唯一但对我而言很重要的补充,即禁用默认错误处理程序。
我必须执行以下操作才能实现我想要的:
- 保留带有负载均衡器的主路由
- 在sub 路由中停用默认错误处理程序
- 使用
doTry
+doCatch
重新抛出调试日志
然后路由看起来像这样。
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();
还有这个:
errorHandler(noErrorHandler());
from("direct:foo")
.doTry()
.process(potentiallyThrowingMyFancyException)
.doCatch(Exception.class)
.process(logAndRethrowProcessor)
.end();
(与“direct:bar”相同)
关于java - 如何处理 Camel 中的故障转移负载均衡器故障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49732440/