2012-05-24 56 views
2

在處理多條路由之間的異常時,我遇到了一些問題。作爲一個java開發者的角度來看,我想提取一些通用的邏輯給一個普通的路由,以便其他路由可以直接調用普通路由,而不用在任何地方包含公共邏輯(如route-version函數調用),但是當它來處理錯誤,我發現它有點棘手。如何處理多條路由中的異常或故障

例如:

//main logic 1 
from("direct:route1") 
    .doTry() 
    .to("direct:common") 
    .doCatch(Exception.class) 
    .log("Error in route1") 
    .end() 

//main logic 2 
from("direct:route2") 
    .doTry() 
    .to("direct:common") 
    .doCatch(Exception.class) 
    .log("Error in route2") 
    .end() 

//common logic 
from("direct:common") 
    .to("mock:commonlogic") 

問題是,當從「模擬:commonlogic」拋出一些異常終點,異常不會被抓到doTry ...無論是在路徑1和路徑2定義doCatch塊。看起來這種異常只能在普通路由範圍內處理。但我想要的是普通路由只是「拋出」異常,「呼叫者」路由自己處理它。有沒有辦法做到這一點?

謝謝

回答

4

您需要禁用公共路由中的錯誤處理。然後從公共路由拋出的任何異常不會由任何錯誤處理程序處理,並傳播回具有try .. catch塊的調用方路由。

from("direct:common") 
    .errorHandler(noErrorHandler()) 
    .to("mock:commonlogic") 
+0

非常感謝您的回答 – Javen

0

您可能想要使用異常子句。 http://camel.apache.org/exception-clause.html

像這樣(在路由生成器的配置方法)

// A common error handler for all exceptions. You could also write onException statements for explicit exception types to handle different errors different ways. 
onException(Exception.class).to("log:something"); 

from("direct:route1")...; 

from("direct:route2")...; 

它應該爲你做的伎倆。

對於當前的路由生成器,onException將是全局的。

+0

感謝您的回答。但我認爲在這種情況下它不起作用。 – Javen

+0

感謝您的回答。但我認爲在這種情況下它不起作用。例如,通用路由負責訪問數據庫,一旦任何數據庫連接失敗,將拋出一個DBException。路由1調用通用路由,只要發生任何數據庫異常就記錄錯誤。路由2有一個用戶/密碼緩存,如果數據庫異常發生,路由2將首先刷新緩存,然後重試。在這種情況下,儘管普通路由中有相同的異常,但每個路由(如route1,route2)的異常處理都不相同。所以全局的onException在這種情況下也不起作用。 – Javen

+0

應該可以做。 onException子句只是半全局的。在一個路線建設者中是全球性的。您可以在DSL中配置多個路由構建器,每個路由構建器都有一個單獨的onException子句。 –