Tomcat环境下MVC控制器中Apache Camel Throttle限流配置问题
问题排查与修复方案
你的代码存在几个核心问题,直接导致限流逻辑完全失效,服务一执行就结束:
- CamelContext生命周期错误:在Controller的请求方法里用
try-with-resources创建DefaultCamelContext,意味着方法执行完上下文就被自动关闭了——Camel刚启动就被销毁,路由根本没机会运行。而且CamelContext应该是全局单例,不能每次请求都新建。 - 路由与业务完全脱节:你定义的REST路由是
/E40101,但实际暴露的接口是/searchInfo,请求根本不会进入Camel的路由;而且业务逻辑infoService.getInfo()直接在Controller里调用,完全没经过Camel的throttle限流环节,限流等于没配。 - 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
相关产品推荐
相关产品推荐

