关于SpringBoot MVC接口超时时间的分析

前言

如果在网上搜索,SpringBoot接口超时时间,很多人会说是配置:spring.mvc.async.request-timeout,这个回答对也不对。主要是这个问题问的就不清不楚,所以这个答案也就不清不楚了。

结论

同步接口没有超时时间一说;

spring.mvc.async.request-timeout配置的是异步接口的超时时间:这里的超时指的是:从主请求处理线程退出后开始,到再次调度请求以进一步处理并发生成的结果时结束。

接口超时时间?

接口超时时间------这句话要分为两部分来分析,第一:什么接口?第二:超时时间是指的什么时间?

首先来看第一个,什么接口?在servlet3.0之后,有同步和异步之分,所以这里的接口没有说明是同步接口还是异步接口。不过一般来说,大多数人用的都是同步接口。

而第二个,超时时间:姑且认为,是我的业务代码执行的时间。

因此,现在来看这个问题:如果说,是一个异步接口,那么spring.mvc.async.request-timeout的配置值是有效的。并且这个指定的是异步请求处理超时之前的时间量(以毫秒为单位)。在 Servlet 3 中,超时从主请求处理线程退出后开始,到再次调度请求以进一步处理并发生成的结果时结束。 请看以下代码:

java 复制代码
@GetMapping("/testCallAble")
public Callable<String> testCallAble() throws InterruptedException {
    Thread.sleep(t1);
    return () -> {
        Thread.sleep(t2);
        return "hello";
    };
}

这是一个异步接口,spring.mvc.async.request-timeout=5S,即异步接口5秒超时,当

  • t1=10000即10s,t2=1000即1s时,接口可正常返回;
  • t1=1000即1s,t2=10000即10s时,接口会报错:AsyncRequestTimeoutException

结合这两个结果,再来理解这配置spring.mvc.async.request-timeout的含义,就清楚了。

但如果不是异步接口,是一个同步的接口呢?这个配置对同步接口不生效,你看配置中的async也知道它说的是异步。其实,对于同步接口来说,没有超时时间一说:即服务端没法对接口进行超时时间配置(其他框架或者个人自行扩展实现的那就另当别论了)。再说的具体一点,A应用调用B应用,那么所谓的超时,都是在客户端配置的,即A应用配置的,而B应用无需设置自己业务代码的超时时间。当然,有时A和B之间可能会有一个网关,网关这里也可以配置超时时间,那么对于A而言,就像是B配置了超时时间,但这个对于B而言,网关也是一个客户端了,所以客户端设置超时时间是可以的。

我个人理解:在同步接口中,一个代码的执行时间是可控的------一个接口与之相关的代码编译的指令有多少,这个可以确定,而唯一不确定的是这个接口调用其他的接口、或者链接数据库之类的,但这个时候,它就变成了客户端,可以设置超时时间了,有了超时时间,那么这些不确定的时间,又变成可确定的了。既然一个可确定时长的代码,又何必再整一个配置来限制它呢?认真想想,就会觉得确实如此。

而异步接口却不一样,它会脱离主线程(tomcat的工作线程),等脱离到再次被执行响应的这个时间是不确定的,所以有必要给一个时间来限制它。认真想想~~~

异步接口超时时间默认值

看文档,这个异步接口超时时间有这么一个说明:如果未设置此值,则使用基础实现的默认超时。这里,这个超时时间默认是30秒(可以从org.apache.catalina.core.AsyncContextImpl中的timeout可以看到),如果配置为0或者-1,则表示永不超时;

另外,这个配置是有优先级的,优先级高的会覆盖低优先级的:

  1. 具体的接口(WebAsyncTask中设置的超时时间)配置的时间,优先级最高;
  2. 其次是WebMvcConfigurer.configureAsyncSupportAsyncSupportConfigurer设置的DefaultTimeout
  3. 其次是配置文件中,配置的spring.mvc.async.request-timeout
  4. 最后才是默认的

server.tomcat.connection-timeout

server.tomcat.connection-timeout配置的作用是:指定了客户端与服务器之间的连接超时时间。当客户端连接到Tomcat服务器时,如果在指定的时间内没有完成与服务器的握手,连接将被视为超时并关闭。注意:是建立连接需要的时间,并非连接处理的时间。

相关推荐
钡铼技术ARM工业边缘计算机3 分钟前
【成本降40%·性能翻倍】RK3588边缘控制器在安防联动系统的升级路径
后端
wangjinjin18017 分钟前
使用 IntelliJ IDEA 安装通义灵码(TONGYI Lingma)插件,进行后端 Java Spring Boot 项目的用户用例生成及常见问题处理
java·spring boot·intellij-idea
CryptoPP36 分钟前
使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
后端·python·websocket·网络协议·区块链
白宇横流学长42 分钟前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
草捏子1 小时前
状态机设计:比if-else优雅100倍的设计
后端
考虑考虑3 小时前
Springboot3.5.x结构化日志新属性
spring boot·后端·spring
涡能增压发动积3 小时前
一起来学 Langgraph [第三节]
后端
sky_ph3 小时前
JAVA-GC浅析(二)G1(Garbage First)回收器
java·后端
涡能增压发动积3 小时前
一起来学 Langgraph [第二节]
后端
TTDreamTT3 小时前
SpringBoot十二、SpringBoot系列web篇之过滤器Filte详解
spring boot