Spring Boot中@RestController与@PathVariable请求排队异常咨询
问题分析与结论
这是Spring MVC的预期行为,并非Bug,根源在于Spring默认启用的资源级并发控制机制。
核心原因
Spring MVC里的HandlerMappingIntrospector组件会把匹配同一URL模板(比如/test/{id})且路径变量值相同(比如id=3)的不同HTTP方法请求,判定为针对同一资源的操作。为了避免并发操作(比如DELETE和GET同时处理同一资源可能引发的状态不一致),默认会对这类请求做序列化排队处理——同一资源的请求会按顺序执行,前一个请求完成后才会处理下一个。
为什么部分场景无排队现象?
- 路径变量值不同:比如DELETE
/test/4和GET/test/3,路径变量值不一样,被识别为不同资源,自然不会排队。 - URL模板不同:GET
/test/{id}/something和GET/test/{id}属于不同的URL模板,哪怕id相同,也会被判定为不同资源,不会触发排队。 - 无路径变量/用请求参数:这类请求要么没有明确的资源标识(比如
/test),要么用请求参数而非路径变量来标识资源,Spring不会将它们归为同一资源,因此不会启动序列化排队。
可选调整方案
如果业务场景确实不需要这个默认控制,可以通过配置spring.mvc.async.request-timeout或者自定义HandlerMappingIntrospector的并发策略来关闭,但一般不建议这么做——这个机制是为了保障资源操作的一致性,避免并发修改带来的数据异常问题。
内容的提问来源于stack exchange,提问作者0xREDACTED
相关产品推荐
相关产品推荐

