Camel onException - 路由具有相同的异常类但行为不同

时间:2016-01-13 09:36:38

标签: java exception exception-handling apache-camel

在单个camel路由中,我有两个url调用,调用两个不同的应用程序。

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

两者都能投掷UnKnowHostException。 因此,如果URL1抛出异常,我必须处理并将交换体设置为“数据源1不可用”,如果URL2抛出相同的异常,我想显示不同的消息。

如何使用 onException

处理此问题

2 个答案:

答案 0 :(得分:2)

您可以使用onWhen。在每个请求之前设置一些标题(在我的示例中为#34; 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 

答案 1 :(得分: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建议)。如果有的话,我很乐意听到它。