关于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服务器时,如果在指定的时间内没有完成与服务器的握手,连接将被视为超时并关闭。注意:是建立连接需要的时间,并非连接处理的时间。

相关推荐
困知勉行19851 小时前
springboot整合redis
java·spring boot·redis
颜淡慕潇1 小时前
深度解析官方 Spring Boot 稳定版本及 JDK 配套策略
java·后端·架构
Victor3561 小时前
Hibernate(28)Hibernate的级联操作是什么?
后端
Victor3561 小时前
Hibernate(27)Hibernate的查询策略是什么?
后端
中年程序员一枚2 小时前
Springboot报错Template not found For name “java/lang/Object_toString.sql
java·spring boot·python
superman超哥2 小时前
Rust 内部可变性模式:突破借用规则的受控机制
开发语言·后端·rust·rust内部可变性·借用规则·受控机制
fanruitian3 小时前
Springboot项目父子工程
java·数据库·spring boot
柒.梧.3 小时前
Spring核心知识全解析:从入门实战到进阶
java·后端·spring
乌日尼乐3 小时前
【Java基础整理】Java字符串处理,String、StringBuffer、StringBuilder
java·后端
qwepoilkjasd3 小时前
DMC发送M-SEARCH请求,DMR响应流程
后端