2016-01-13 47 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建议)。如果有的话,很乐意听到它。

相关问题