2016-07-29 20 views
2

我必須實現一個錯誤處理程序,該程序在發送SOAP請求並處理其響應的業務流程上使用Camel Redelivery Policy。在處理過程中,可能會拋出一個特殊的異常(RetryException)。這個異常在錯誤處理程序級別上被捕獲(感謝onException(RetryException.class))。 這是很容易的部分。如何在重新傳送時忽略駱駝中的一個異常

現在我想忽略cxf端點可能拋出的異常(如果每個示例存在連接錯誤)並處理它們。 所以我嘗試:

  • (1)具有與重試策略彙總2路(並具有noErrorHandler)
  • (2)一個子路由onException的條款,以確保重播2的一個主要途徑拋出異常路線和不僅處理之一:
    • (3)發送SOAP請求路由
    • (4),其處理所述響應和可以拋出retryException路線。

爲了忽略由CXF端點拋出的異常我執行路線(3)那樣:

public void configure() { 
    from(ROUTE_NAME). 
    .handleFault() // To handle Soap fault 
    .onException(Fault.class) 
     .continued(true) 
     .end() 
    .to("cxf:[...]") 
    ; 
} 

它像一個魅力,響應處理器之前進行一些檢查拋出RetryException ...但是繼續的說明拋棄了我之前所有有關重新交付的信息,Camel相信這個例外是第一個。所以這條路線進入了一種永久循環的重試。

交換頂部以前 onException的(故障):

Headers: {breadcrumbId=ID-ITEM-S28636-63117-1469800853403-0-1, CamelRedelivered=true, CamelRedeliveryCounter=1, CamelRedeliveryMaxCounter=2, operationName=[...]} 

交換頂部 onException的(故障):

Headers: {breadcrumbId=ID-ITEM-S28636-63117-1469800853403-0-1, operationName=[...]} 

有沒有遇到什麼解決辦法忽略某些子路徑異常不擦除上層路由重試策略?

回答

0

我想你是通過direct端點連接路線;如果是這樣的話,我認爲你的主要問題是你將Fault標記爲繼續,這意味着處理,這很可能是你的重新傳送標題被清除的原因。您可以嘗試使用seda或消息隊列,而不是direct端點,因爲它基本上將您的路由鏈接爲一個。

+1

謝謝這有效,但我用另一種方式使用doTry和doCatch完成。 –