Java Camel OneException-具有相同异常类但不同操作的路由
在一个camel路由中,我有两个url调用,调用两个不同的应用程序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处理此问题您可以使
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建议)。如果有的话,我很想听听。我会使用cameltry 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
头来选择所需的处理程序。我不需要解决方法。我期待一个干净的解决方案或一个令人信服的声明,说“这不可能与一个例外有关”