如何在Apache Camel中发送带参数的REST请求并实现循环调用
实现方案
你要实现的需求核心用到Apache Camel的两个核心特性即可完成:
- 拆分器(Split EIP):将ID列表拆分为单ID独立消息,实现逐个循环处理的逻辑
- 动态端点
toD:替代原有静态的to方法,支持运行时读取消息内容动态拼接HTTP请求路径
修改后完整路由代码
@Component public class EgrRegistryNumbersRoute extends RouteBuilder { private final JacksonDataFormat format = new ListJacksonDataFormat(NumbersDTO.class); @Autowired DataSource dataSource; // 后续可替换为从数据库查询得到的ID列表 List<Integer> myList = List.of(1, 2, 3, 4, 5); @Override public void configure() throws Exception { from("timer://foo?repeatCount=1") .noAutoStartup() .routeId("NumbersRoute-route") // 将ID列表设置为消息体 .setBody(constant(myList)) // 拆分列表,每个下游消息对应单个ID .split(body()) // 可选配置:单个ID请求失败不中断整体处理流程 .stopOnException(false) .setHeader(Exchange.HTTP_METHOD, constant("GET")) // 动态拼接URL,用当前消息体的ID填充路径参数 .toD("http://server/api/v2/getRegNumByState/${body}") .unmarshal(format) .log(">>>${body}") .process(new InsertProcessor("table_name", "column")) .to("jdbc:dataSource"); } }
补充说明
- 如果ID列表需要从本地数据库查询获取,只需把
setBody(constant(myList))替换为JDBC查询逻辑即可:比如先调用to("jdbc:dataSource?query=select id from 你的ID表名"),查询得到的列表会自动存入消息体,后续拆分逻辑无需修改 - 你当前的
InsertProcessor用字符串拼接SQL的方式存在SQL注入风险,如果ID来源不可控,建议改用JDBC预处理参数的方式构建插入语句 - 如果需要提升处理效率,可以在
split(body())后添加parallelProcessing()配置开启并行请求,还可通过executorService自定义线程池控制并发数,避免对第三方服务造成过大压力
内容的提问来源于stack exchange,提问作者Andrei Gavrilov
相关产品推荐
相关产品推荐

