Spring Boot 2.1.7请求超时问题:server.connection-timeout无效求解决方案
解决方案:Spring Boot 2.1.7 接口全局请求处理超时配置
为什么之前的配置不生效
你配置的server.connection-timeout或server.tomcat.connection-timeout是控制TCP连接建立阶段的超时——只有客户端和Tomcat建立连接的时间超过设定值时才会触发。而你测试的是接口业务处理阶段的超时(用Thread.sleep模拟慢处理),这两个完全是不同场景,所以之前的配置无效。
有效方案
1. Spring MVC全局异步请求超时配置
在application.properties(或bootstrap.properties)中添加以下配置,针对所有Spring MVC接口设置处理超时:
# 异步请求超时时间,单位毫秒 spring.mvc.async.request-timeout=3000
需要将接口改为异步处理形式(Spring MVC会自动将同步请求包装为异步请求),修改控制器方法示例:
@GetMapping("/test-timeout") public Callable<String> testTimeout() { return () -> { Thread.sleep(4000); // 模拟超过3秒的业务处理 return "success"; }; }
当处理时间超过3秒时,Tomcat会自动终止请求,返回408超时响应。
2. 自定义拦截器全局控制超时
如果需要无需修改接口返回类型的全局控制,可自定义拦截器结合超时机制:
@Component public class TimeoutInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; // 将方法执行包装为带超时的异步任务 Callable<?> task = () -> handlerMethod.getMethod().invoke(handlerMethod.getBean(), request, response); FutureTask<?> futureTask = new FutureTask<>(task); new Thread(futureTask).start(); try { // 设置3秒超时阈值 futureTask.get(3000, TimeUnit.MILLISECONDS); } catch (TimeoutException e) { futureTask.cancel(true); response.setStatus(HttpStatus.REQUEST_TIMEOUT.value()); response.getWriter().write("请求超时,请稍后重试"); return false; } } return true; } }
注册拦截器到Spring MVC:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private TimeoutInterceptor timeoutInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(timeoutInterceptor).addPathPatterns("/**"); } }
此方式无需修改原有接口,直接对所有接口生效。
3. Tomcat异步超时配置
通过配置类自定义Tomcat Connector,设置全局异步超时:
@Configuration public class TomcatConfig { @Bean public TomcatServletWebServerFactory tomcatServletWebServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.addConnectorCustomizers(connector -> { // 设置异步处理超时时间,单位毫秒 connector.setAsyncTimeout(3000); }); return factory; } }
同样需要将接口改为异步形式(返回Callable或DeferredResult),Tomcat会在异步处理超时后自动终止请求。
测试验证
修改后用Postman调用接口,若处理时间超过3秒,会收到超时响应,说明配置生效。
内容的提问来源于stack exchange,提问作者kris_pan
相关产品推荐
相关产品推荐

