簡體   English   中英

如何處理Camel中的故障轉移負載平衡器故障?

[英]How to handle failover load balancer failure in 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但是我似乎無法理解如何在負載平衡器及其內部異常處理中很好地工作。 一方面,我想負載平衡期間記錄堆棧跟蹤,另一方面,我想使用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. 故障轉移負載均衡器完全失敗了,您可能想為調用方創建一個不錯的最終錯誤響應?

我最終使用了與洛朗在他的回答中提到的相同方法。 我將發布解決方案以提供完整的示例,但接受他的回答。

請注意,在我的回答中,唯一但很重要的一點是,它禁用了默認錯誤處理程序。

為了達到我想要的目的,我必須執行以下操作:

  1. 將主路由留給負載均衡器
  2. 取消激活子路由中的默認錯誤處理程序
  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”相同)

我更喜歡一個doTry ... doCatch家伙自己:-)

您可以將loadBalance EIP封裝在doTry ... doCatch內,並視情況在其中處理最終異常。 對於中間異常也是如此:在from(“ direct:foo”)from(“ direct:bar”)路由內使用doTry ... doCatch並根據需要對捕獲的異常進行操作。 當然,不要忘了之后再將它們扔掉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM