当前位置: 首页 > 知识库问答 >
问题:

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

凤高澹
2023-03-14

在一条骆驼路线中,我有两个url调用,调用两个不同的应用程序。

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

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

如何使用onException处理此问题

共有2个答案

吕志诚
2023-03-14

我会使用camel-try-catch-block(正如@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与一个路由一起使用,但应用于不同的调用(除了使用@Alexeys或@Ewout建议)。如果有的话,很想听听。

常嘉平
2023-03-14

您可以使用onWhat。在每个请求之前和之后使用不同的处理程序设置一些标头(在我的示例“httpDatassource”中)。

    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 
 类似资料:
  • 我想简化一段我的代码,但不确定如何做。我有 所以我想让这四个应用一起做同样的事情。我开始考虑为结果做一个函数,如下所示: 但我认为如果我把所有的应用程序合并在一起做同样的事情会更好。知道吗? 谢谢,

  • 问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定

  • 我正在使用的数据库有许多具有相同列但(显然)具有不同表名的表(不是我设计的)。例如(这些是数据库表名): 有没有可能用JPA和Hibernate将这些映射到一个Java类实体?类的名称是,然后在使用它时传入例如,以便对象使用表? 还是只使用普通的、普通的Java对象来完成这样的任务更好? 谢谢你!

  • 我说的是Java,但这个概念也适用于其他语言-- 我们在同一个类上有两个方法,它们具有相同的基本功能,但提供不同的返回类型。这两种方法都会给你所有的东西,但一个得到一个可以提供对所有东西的访问的可迭代的,一个得到一个包含所有东西的集合。 我们知道你不能这样做(因为它不会编译): 那么,有人想过如何命名这些方法吗?这似乎是一个简单的解决方法: 然而,这显然有些冗长,可能不是最好的解决方案。我问的这个

  • 问题内容: 在以下代码中,我不明白为什么当它属于两个不同的对象时具有相同的ID? 问题答案: 我认为这是正在发生的事情: 取消引用时,将在内存中创建其副本。该存储位置由以下位置返回 由于没有引用到刚刚创建的方法的副本,因此GC将其回收,并且该内存地址再次可用 取消引用时,将在相同的内存地址(可用)中创建它的副本,您可以再次使用该地址。 第二个副本是GCd 如果您要运行一堆其他代码并再次检查实例方法

  • ...NestedServletException:请求处理失败;嵌套异常是java.lang.IllegalStateException:映射到HTTP路径的处理程序方法不明确...