camel系列-EndpointRouteBuilder

概念

EndpointRouteBuilder 与 RouteBuilder 同样是一个路由构建器,它允许使用类型安全的端点URL配置。

注意点:其只适用于 Java DSL

DSL 示例

RouteBuilder DSL

基于 RouteBuilder 构建路由,ftp 的路由构建需要很多 url 组成,缺点是容易出错,且 url 长度过长

1
2
3
4
5
6
7
8
9
public class MyRoutes extends RouteBuilder {
@Override
public void configure() throws Exception {
from("ftp://foo@myserver?password=secret&recursive=true&
ftpClient.dataTimeout=30000&
ftpClientConfig.serverLanguageCode=fr")
.to("bean:doSomething");
}
}

EndpointRouteBuilder DSL

其有以下 2 个特点

  1. 类型安全,明确路由参数的所有特性均以指定方法实现,而非 url 参数,有点类似猜盲盒的感觉
  2. 以链式方法设置路由属性完成路由构建
1
2
3
4
5
6
7
8
9
10
public class MyRoutes extends EndpointRouteBuilder {
@Override
public void configure() throws Exception {
from(ftp("myserver").account("foo").password("secret").recursive(true)
.advanced()
.ftpClientParameters(Collections.singletonMap("dataTimeout", 30000))
.ftpClientConfig(Collections.singletonMap("serverLanguageCode", "fr")))
.to(bean("something"));
}
}

在路由构建器之外使用 ENDPOINT-DSL

  1. 使用 resolve 方法构建 Endpoint
1
2
Endpoint mqtt = paho("sensor").clientId("myClient").userName("scott").password("tiger")
.resolve(context);
  1. 使用 FluentProducerTemplate 发送消息到 EndpointProducerResolver,EndpointProducerResolver 可以将路由构建器的参数转换成一个 Endpoint
1
2
3
public interface EndpointProducerResolver {
Endpoint resolve(CamelContext context) throws NoSuchEndpointException;
}

每一个路由构建器都实现了 EndpointProducerResolver 接口,所以可以使用路由构建器充当路由的 Endpoint

1
2
3
4
5
6
import static org.apache.camel.builder.endpoint.StaticEndpointBuilders.kafka;

context.createFluentProducerTemplate()
.to(kafka("start").clientId("myClient").brokers("{{myBrokers}}").partitionKey("myKey"))
.withBody("Hello World")
.send();