Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Camel OneException-具有相同异常类但不同操作的路由_Java_Exception_Exception Handling_Apache Camel - Fatal编程技术网

Java Camel OneException-具有相同异常类但不同操作的路由

Java Camel OneException-具有相同异常类但不同操作的路由,java,exception,exception-handling,apache-camel,Java,Exception,Exception Handling,Apache Camel,在一个camel路由中,我有两个url调用,调用两个不同的应用程序 to("http://datasource1/data) //some process to("http://datasource2/data) //some process 两者都能够抛出未知异常。 因此,如果URL1抛出我必须处理的异常,并将exchange主体设置为“Datasource 1 not available”,如果URL2抛出相同的异常,我希望显示不同的消息 如何使用OneException处理此问题您可以使

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

to("http://datasource1/data)
//some process
to("http://datasource2/data)
//some process
两者都能够抛出
未知异常
。 因此,如果URL1抛出我必须处理的异常,并将exchange主体设置为“Datasource 1 not available”,如果URL2抛出相同的异常,我希望显示不同的消息


如何使用OneException处理此问题

您可以使用
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 

您可以使用
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 

我会使用camel
try-catch
块(正如@soilworker所建议的那样)

它更详细,但很容易理解,并且清楚地将消息与异常关联起来。如果您希望使
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建议)。如果有的话,我很想听听。

我会使用camel
try catch
块(按照@soilworker的建议)

它更详细,但很容易理解,并且清楚地将消息与异常关联起来。如果您希望使
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建议)。如果有,我很想听听。

也许您可以在路由中使用2个try/catch块来单独处理异常,而不是使用OneException块?有关更多信息,请参阅。也许您可以在路由中使用2个try/catch块来分别处理异常,而不是使用OneException块?有关详细信息,请参阅。您可以在
onWhen
中使用任何其他简单表达式。可能是基于对异常消息内容的解析,或者使用
CamelHttpUri
头来选择所需的处理程序。我不需要解决方法。我期待一个干净的解决方案或令人信服的声明“使用OneException是不可能的。您可以在
onWhen
中使用任何其他简单表达式。可能是基于对异常消息内容的解析,或者使用
CamelHttpUri
头来选择所需的处理程序。我不需要解决方法。我期待一个干净的解决方案或一个令人信服的声明,说“这不可能与一个例外有关”