You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 10:12:03