Spring Boot异步请求超时实战指南:从异常处理到性能调优
当你的电商平台用户在支付时页面一直转圈,后台却静默抛出 AsyncRequestTimeoutException ,这种体验灾难该如何化解?本文将带你直击异步请求超时的核心痛点,不仅解决表象问题,更深入优化整个异步处理链路。
1. 异步超时异常的本质解析
在Spring MVC的异步处理机制中, AsyncRequestTimeoutException 就像个严格的计时员。当使用 @Async 、 Callable 或 DeferredResult 时,框架会启动倒计时时钟。默认情况下,这个时钟设置为30秒——如果异步任务在沙漏流尽前未能完成,就会触发这个异常。
典型症状诊断 :
- 前端长时间显示加载状态(超过30秒)
- 后台日志出现
org.springframework.web.context.request.async.AsyncRequestTimeoutException - 调用第三方服务(如支付网关)时频繁发生
// 典型的问题控制器代码示例
@GetMapping("/async-order")
public DeferredResult<String> processOrder() {
DeferredResult<String> deferredResult = new DeferredResult<>();
// 模拟耗时操作
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(40000); // 超过默认超时
deferredResult.setResult("success");
} catch (InterruptedException e) {
deferredResult.setErrorResult(e);
}
});
return deferredResult;
}
关键点:异步超时与同步请求超时有本质区别。前者是Spring MVC对异步任务完成的等待时限,后者通常是HTTP连接保持的时间阈值。
2. 超时时间配置的双轨方案
2.1 YAML配置方案(推荐)
在 application.yml 中设置是最直观的方式,适合大多数常规场景:
spring:
mvc:
async:
request-timeout: 60000 # 单位毫秒
参数选择参考表 :
| 业务类型 | 建议超时 |
|---|


404

被折叠的 条评论
为什么被折叠?



