2016-01-13 155 views
0

在單個camel路由中,我有兩個url調用,可以調用兩個不同的應用程序。Camel onException - 具有相同異常類但具有不同動作的路由

to("http://datasource1/data) 
//some process 
to("http://datasource2/data) 
//some process 

兩者都能投擲UnKnowHostException。 因此,如果URL1引發異常,我必須處理並將交換機構設置爲「數據源1不可用」,並且如果URL2引發相同的異常,我想顯示不同的消息。

如何使用onException的

+2

也許你可以在你的路由中使用2個try/catch塊分別處理異常,而不是使用onException塊?有關更多信息,請參閱http://camel.apache.org/try-catch-finally.html。 – soilworker

回答

2

您可以使用onWhen來處理這個問題。在每個請求之前以及在使用不同的處理程序之後設置一些頭文件(在我的示例中爲「httpDatasource」)。

onException(UnKnowHostException.class).onWhen(header("httpDatasource").isEqualTo("1")).to("..."); 
    onException(UnKnowHostException.class).onWhen(header("httpDatasource").isEqualTo("2")).to("..."); 

    ..... 
    setHeader("httpDatasource").constant("1") 
    to("http://datasource1/data) 
    //some process 
    setHeader("httpDatasource").constant("2") 
    to("http://datasource2/data) 
    //some process 
+0

這看起來有點髒解決方案.. – madhairsilence

+0

你可以在'onWhen'中使用任何其他簡單的表達式。可能基於解析異常消息的內容,或者使用'CamelHttpUri'頭來選擇所需的處理程序。 –

+0

我不想要工作。我期待着一個乾淨的解決方案或一個明確的聲明,說「它不可能與onException – madhairsilence

1

我會使用駱駝try catch塊(如@soilworker建議)。

.doTry() 
    .to("http://datasource1/data") 
.doCatch(UnknownHostException.class) 
    // Add message 1 here 
.end() 
//process 
.doTry() 
    .to("http://datasource2/data") 
.doCatch(UnknownHostException.class) 
    // Add message 2 here 
.end() 
// process 

它更冗長,但它很容易理解,並明確地將該消息與異常關聯。如果您希望使to調用異步,您可以。

您可以使用路由特定onException但你會需要你的路線分成多個路線:

from("somewhere") 
    .to("direct:datasource1") 
    //process 
    .to("direct:datasource2") 
    //process 

from("direct:datasource1") 
    .onException(UnknownHostException.class) 
     // add message 1 here 
    .end() 
    .to("http://datasource/data") 

from("direct:datasource2") 
    .onException(UnknownHostException.class) 
     // add message 2 here 
    .end() 
    .to("http://datasource2/data") 

我不相信有使用onException與一個路線的方式,但應用於不同to來電(除了使用@Alexeys或@Ewouts建議)。如果有的話,很樂意聽到它。

相關問題