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

Tomcat环境下MVC控制器中Apache Camel Throttle限流配置问题

问题排查与修复方案

你的代码存在几个核心问题,直接导致限流逻辑完全失效,服务一执行就结束:

  1. CamelContext生命周期错误:在Controller的请求方法里用try-with-resources创建DefaultCamelContext,意味着方法执行完上下文就被自动关闭了——Camel刚启动就被销毁,路由根本没机会运行。而且CamelContext应该是全局单例,不能每次请求都新建。
  2. 路由与业务完全脱节:你定义的REST路由是/E40101,但实际暴露的接口是/searchInfo,请求根本不会进入Camel的路由;而且业务逻辑infoService.getInfo()直接在Controller里调用,完全没经过Camel的throttle限流环节,限流等于没配。
  3. REST组件未集成Tomcat:你只定义了REST路由,但没配置Camel的REST组件绑定Tomcat Servlet,导致Camel的REST接口根本无法被外部访问。

修复后的实现方案(以Spring Boot为例,适配Tomcat环境)

1. 先添加必要依赖(Maven)

<dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-spring-boot-starter</artifactId>
    <version>3.20.2</version> <!-- 替换为你使用的Camel版本 -->
</dependency>
<dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-servlet-starter</artifactId>
    <version>3.20.2</version>
</dependency>
<dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-rest-starter</artifactId>
    <version>3.20.2</version>
</dependency>

2. 编写Camel路由配置类(单例,由Spring管理)

@Component
public class InfoSearchThrottleRoute extends RouteBuilder {

    @Autowired
    private InfoService infoService;

    @Override
    public void configure() throws Exception {
        // 配置REST组件绑定到Tomcat Servlet,开启JSON绑定
        restConfiguration()
            .component("servlet")
            .bindingMode(RestBindingMode.json);

        // 定义和业务匹配的REST接口
        rest("/searchInfo")
            .get()
            .param().name("id").type(RestParamType.query).required(true).endParam()
            .to("direct:throttleHandler");

        // 限流核心逻辑:10秒内最多处理5次请求
        from("direct:throttleHandler")
            .throttle(5)
            .timePeriodMillis(10000)
            // 调用实际业务逻辑
            .process(exchange -> {
                String id = exchange.getIn().getHeader("id", String.class);
                List<BuilEntity> infoList = infoService.getInfo(id);
                exchange.getIn().setBody(infoList);
            });
    }
}

3. 简化Controller(可选,也可以直接用Camel的REST接口,无需自己写Controller)

如果想保留原Controller的结构,改成调用Camel路由:

@RestController
public class InfoController {

    @Autowired
    private ProducerTemplate producerTemplate;

    @GetMapping("/searchInfo")
    public List<BuilEntity> searchInfo(@RequestParam String id) {
        // 把请求发送到Camel限流路由,获取结果
        return producerTemplate.requestBody("direct:throttleHandler", id, List.class);
    }
}

关键说明

  • CamelContext由Spring自动管理,是全局单例,不会随请求创建销毁,保证路由持续运行。
  • 请求会先经过Camel的throttle限流,再执行业务逻辑,真正实现10秒5次的限制。
  • 通过restConfiguration绑定Servlet,让Camel的REST接口能被Tomcat正确处理。

内容的提问来源于stack exchange,提问作者james

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:15:06