【问题标题】:How to handle failover load balancer failure in Camel?如何处理 Camel 中的故障转移负载均衡器故障?
【发布时间】:2018-04-09 11:58:52
【问题描述】:

如何捕获导致 Camel 故障转移负载平衡器失败的 final 异常(例如,准备好 (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. 故障转移负载平衡器完全失败,您可能想为调用者创建一个很好的final错误响应?

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:

    我最终使用了 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”相同)

    【讨论】:

      【解决方案2】:

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

      您可以将您的 loadBalance EIP 包含在 doTry...doCatch 中,并在其中处理您认为合适的最终异常。 中间异常也一样:在 from("direct:foo")from("direct:bar") 路由中使用 doTry...doCatch 并在随心所欲地捕获异常。当然,之后别忘了重新扔掉它们。

      【讨论】:

        猜你喜欢
        • 2016-09-20
        • 1970-01-01
        • 1970-01-01
        • 2015-06-05
        • 1970-01-01
        • 2013-11-15
        • 2013-08-30
        • 2021-11-05
        • 1970-01-01
        相关资源
        最近更新 更多