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

标签 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();

与:

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 错误处理器中区分:

  1. 发生了触发故障转移的异常,并且

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

最佳答案

我最终使用了 Laurent 在他的回答中提到的相同方法。我将发布解决方案以获得完整示例,但接受他的回答。

请注意他的回答中唯一但对我而言很重要的补充,即禁用默认错误处理程序。

我必须执行以下操作才能实现我想要的:

  1. 保留带有负载均衡器的主路由
  2. sub 路由中停用默认错误处理程序
  3. 使用 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/

相关文章:

java - Java hashmap 搜索真的是 O(1) 吗?

spring - 使用 camel http4 的系统属性代理设置

java - 如何在 Apache Camel DSL 中回滚事务?

java - 从 Spring 注释配置初始化 Camel

java - Camel HTTP 组件似乎卡住了

java - 如何在 Iterable 上执行 Stream 函数?

java - 我的 split() 及其正则表达式有什么问题?

java - 列出 Android 库中的所有应用程序资源

java - 使用java更改unix文件的组

java - Camel HTTP 端点 : How to set URL-String to POST Parameter