Apache Camel最佳实践:如何用单个SpringBoot应用消费多个REST端点数据
完全不需要为每个ID单独编写RouteBuilder,更不需要每个路由启动单独的SpringBoot应用,单个应用就可以批量加载所有路由,具体实现方案如下:
步骤1:统一管理所有对接ID
把需要对接的ID、服务地址等可配置项统一放到SpringBoot配置文件中,避免硬编码。示例application.yml配置:
camel: rest-sources: # 统一的服务端地址 server-uri: https://your-rest-server.com # 所有需要对接的ID列表 ids: - id_001 - id_002 # 剩余上千个ID直接加在这即可
步骤2:编写配置绑定类
通过@ConfigurationProperties把配置文件的内容映射成Java对象,方便代码中调用:
import org.springframework.boot.context.properties.ConfigurationProperties; import java.util.List; @ConfigurationProperties(prefix = "camel.rest-sources") public class RestSourceProperties { private String serverUri; private List<String> ids; // 生成getter、setter方法 public String getServerUri() {return serverUri;} public void setServerUri(String serverUri) {this.serverUri = serverUri;} public List<String> getIds() {return ids;} public void setIds(List<String> ids) {this.ids = ids;} }
步骤3:编写通用批量路由类
只需要写一个RouteBuilder,遍历所有ID批量生成路由即可,注意要给每个路由、定时器设置唯一标识,避免冲突:
import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; import org.springframework.stereotype.Component; @Component public class BatchRestRouteBuilder extends RouteBuilder { private final RestSourceProperties restSourceProperties; // 构造注入配置对象 public BatchRestRouteBuilder(RestSourceProperties restSourceProperties) { this.restSourceProperties = restSourceProperties; } @Override public void configure() throws Exception { String serverUri = restSourceProperties.getServerUri(); // 遍历所有ID批量生成路由 for (String id : restSourceProperties.getIds()) { // 每个路由设置唯一ID,方便后续运维管理 String routeId = "rest_route_" + id; // 定时器名称要唯一,避免多个路由共用同一个定时器出现异常 String timerUri = String.format("timer:timer_%s?repeatCount=1", id); // 拼接当前ID对应的REST端点地址 String restUri = String.format("%s/v1/source/%s%s?disableStreamCache=true", serverUri, id, "::" + _deviceName + "::" + _deviceProperty); from(timerUri) .routeId(routeId) .setBody(simple("${null}")) .setHeader(Exchange.CONTENT_TYPE, simple("text/event-stream")) .setHeader("CamelHttpMethod", simple("GET")) .to(restUri) .process(data -> { // 所有路由通用的处理逻辑统一写在这里,修改一处全量生效 }); } } }
步骤4:启动类添加配置扫描注解
在原有SpringBoot启动类上加上@EnableConfigurationProperties注解,让配置类生效即可:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @ComponentScan(basePackages = "my.package.where.components.reside") @EnableConfigurationProperties(RestSourceProperties.class) public class MyRouteHandler { public static void main(String[] args) { SpringApplication.run(MyRouteHandler.class, args); } }
可选优化
如果ID数量过多,担心同时发起请求压垮下游接口,可以给timer添加delay参数,让不同路由的请求错开时间触发,比如:
// 每个路由延迟N*100毫秒启动,N为当前ID的下标 String timerUri = String.format("timer:timer_%s?repeatCount=1&delay=%d", id, index * 100);
内容的提问来源于stack exchange,提问作者WolfiG
相关产品推荐
相关产品推荐

