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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:39:58