SpringBoot配置server.tomcat.connection-timeout不生效问题咨询
问题原因解析
你配置的server.tomcat.connection-timeout未生效是正常现象,该参数的作用范围和你预期的业务处理超时并不匹配:
server.tomcat.connection-timeout定义的是TCP连接建立、请求报文接收阶段的超时时间,指Tomcat收到客户端TCP连接请求后,等待客户端发送完整请求行、请求头的最大等待时长。你当前的场景是请求报文已经完整送达Tomcat,正在执行业务逻辑(代码中的Thread.sleep(10000)属于业务处理阶段),这个阶段不在该参数的管控范围内,所以配置不会生效。spring.mvc.async.request-timeout是Spring MVC针对异步请求场景提供的业务处理超时配置,所以你使用Callable<?>时配置该参数生效符合预期。
同步接口实现5秒超时的解决方案
你当前写的是同步接口,要实现业务处理超时可以选择两种方案:
方案1:改造成异步接口(推荐)
改造成异步接口后直接使用Spring MVC提供的异步超时配置即可,改造成本最低:
- 修改application.properties,添加异步超时配置:
# 单位为毫秒,5秒即配置为5000 spring.mvc.async.request-timeout=5000
- 改造Controller接口返回值为
Callable:
@PostMapping("/getdata") public Callable<String> call() { return () -> { Thread.sleep(10000); return "Hello"; }; }
改造完成后,请求超过5秒未处理完成就会自动触发超时返回。
方案2:自定义拦截器实现同步请求超时
如果不想改造成异步接口,可以自定义HandlerInterceptor拦截所有请求,在请求进入时启动定时任务,到达超时时间后如果请求仍未处理完成,主动中断请求线程并返回超时响应。注意该方案需要处理线程中断的安全问题,避免业务逻辑出现异常脏数据。
内容的提问来源于stack exchange,提问作者user15006167
相关产品推荐
相关产品推荐

