camel系列-路由配置

概念

路由配置,用于将配置与路由分离。这可以用于在一组路由中配置不同的错误处理等情况。在以前的 Camel 版本中,这样做比较麻烦,因为您要么必须将相同的配置复制到一组路由,要么依赖全局错误处理配置。

现在您可以配置多个路由配置,然后在每个路由上指定要使用的配置(您可以通过 id、通配符和正则表达式进行匹配)。

如何实现

定义路由配置

  1. 继承 RouteConfigurationBuilder 类
  2. 通过 routeConfiguration 方法定义路由配置
1
2
3
4
5
6
7
8
9
public class MyJavaErrorHandler extends RouteConfigurationBuilder {

@Override
public void configuration() throws Exception {
routeConfiguration("javaError")
.onException(Exception.class).handled(true)
.log("Java WARN: ${exception.message}");
}
}

引用路由配置

通过 routeConfigurationId 引用路由配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MyJavaRouteBuilder extends RouteBuilder {

@Override
public void configure() throws Exception {
from("timer:java?period=2s")
// refer to the route configuration by the id to use for this route
.routeConfigurationId("javaError")
.setBody(method(MyJavaRouteBuilder.class, "randomNumber"))
.log("Random number ${body}")
.filter(simple("${body} < 30"))
.throwException(new IllegalArgumentException("The number is too low"));
}

public static int randomNumber() {
return new Random().nextInt(100);
}
}

默认路由配置

路由配置要么被赋予一个明确的唯一 ID,要么配置是无命名的。对于未明确分配路由配置的路由,使用无命名配置作为默认/备用配置。

假设您有一个无名配置和另一个名为retryError

1
2
3
4
5
6
7
8
9
10
11
12
public class MyJavaErrorHandler extends RouteConfigurationBuilder {

@Override
public void configuration() throws Exception {
routeConfiguration()
.onException(Exception.class).handled(true)
.log("WARN: ${exception.message}");

routeConfiguration("retryError")
.onException(Exception.class).maximumRedeliveries(5);
}
}

以及以下两条路线:

1
2
3
4
5
6
from("file:cheese").routeId("cheese")
.to("kafka:cheese");

from("file:beer").routeId("beer")
.routeConfigurationId("retryError")
.to("jms:beer");

在上面的示例中,cheese路由没有分配路由配置,因此该路由将使用默认配置,如果出现异常将记录警告。

另一方面,beer 路由分配了路由配置 retryError ,并且此配置将在异常情况下重试最多 5 次,然后如果仍然错误则失败并回滚。

XML 中的路由配置

使用 XML DSL 时,您可以在 XML 文件中编写路由配置,如下所示:

1
2
3
4
5
6
7
<routeConfiguration id="xmlError">
<onException>
<exception>java.lang.Exception</exception>
<handled><constant>true</constant></handled>
<log message="XML WARN: ${exception.message}"/>
</onException>
</routeConfiguration>

在 XML 路由中,您可以分配要使用的配置:

1
2
3
4
5
<route routeConfigurationId="xmlError">
<from uri="timer:xml?period=5s"/>
<log message="I am XML"/>
<throwException exceptionType="java.lang.Exception" message="Some kind of XML error"/>
</route>

参考