开发者

Springboot调整接口响应返回时长详解(解决响应超时问题)

开发者 https://www.devze.com 2023-01-31 10:59 出处:网络 作者: JermeryBesian
目录配置Http会话超时application.properties中配置会话超时以程序方式配置会话超时配置接口访问超时一、配置文件方式二、配置Config配置类需要避免踩到的坑tomcat的设置Nginx的设置总结配置Http会话超时
目录
  • 配置Http会话超时
    • application.properties中配置会话超时
    • 以程序方式配置会话超时
  • 配置接口访问超时
    • 一、配置文件方式
    • 二、配置Config配置类
    • 需要避免踩到的坑
      • tomcat的设置
      • Nginx的设置
  • 总结

    配置Http会话超时

    可以通过两种方式为Spring Boot应用程序配置HTTP会话超时

    application.properties中配置会话超时

    最简单的方法是在你的application.properties中加入参数server.servlet.session.timeout。比如说

    server.servlet.session.timeout=60s
    

    还要注意的是,Tomcat不允许你将超时时间设置得少于60秒。

    以程序方式配置会话超时

    假设我们想让我们的HttpSession只持续两分钟。为了实现这一点,我们可以在我们的WebConfiguration类中添加一个EmbeddedServletContainerCustomizer Bean,内容如下。

    @Configuration
    public class WebConfiguration {
      @Bean
      public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() {
        return new EmbeddedServletContainerCustomizer() {
          @Override
          public void customize(ConfigurableEmbeddedServletContainer container) {
            container.setSessionTimeout(2, TimeUnit.MINUTES);
          }
        };
      }
    }
    

    这里再给出一个使用Java 8和lambda表达式的捷径写法。

    public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() {
        return (ConfigurableEmbeddedServletContainer container) -> {
          container.setSessionTimeout(2, TimeUnit.MINUTES);
        };
      }
    

    在应用程序启动期间,Spring Boot自动配置检测到EmbeddedServletContainerCustomizer,并调用customize(…)方法,传递对Servlet容器的引用。

    配置接口访问超时

    SpringBoot设置接口访问超时时间有两种方式

    一、配置文件方式

    在配置文件application.properties中加了spring.mvc.async.request-timeout=120000,意思是设置超时时间为120000ms即120s

    # [设置接口的超时时间]
    spring.mvc.async.request-timeout=120000
    

    二、配置Config配置类

    还有一种就是在config配置类中加入:

    public class WebMvcConfig extends WebMvcConfigurerAdapter {
    	@Override
    	public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {
    		configurer.setDefaultTimeout(20000);
    		cohttp://www.devze.comnfigurer.registerCallableInterceptors(timeoutInterceptor());
    	}
    
    	@Bean
    	public TimeoutCallableProcessingInterceptor timeoutInterceptor() {
    		return new TimeoutCallableProcessingInterceptor();
    	}
    }
    

    采用上面的两种配置之一后,重新运行服务,调用接口最大等待的响应时间为上面设置的120s。

    需要避免踩到的坑

    如果按上述配置后,还是会出现超时情况,有可能是以下几种技术的问题,需要对应设置一下。

    tomcat的设置

    上文中是springboot开发环境,使用了内置的tomcat。而在实际生产环境中一般用的是外置tomcat来部署(便于后续发布更新),需要在tomcat的配置文件server.XML中设置超时时间(默认20秒编程以下设置为120秒)。

        <Connector port="8811" protocol="HTTP/1.1"
                   connectionTimeout="120000"
                   redirectPort="8443" />
    

    Nginx的设置

    如果服务端使用到Nginx做了反向代理转发请求,就需要在Nginx的配置文件nginx.conf中设置超时时间,否则会返回“java.io.IOException: 你的主机中的软件中止了一个已建立的连接”这样的异常提示。

    未设置时Nginx响应时间默认60秒,这里我将http头部的keepalive_timeoutclient_hwww.devze.comeader_timeoutclient_body_timeoutsend_timeout 、以及server代码块中的proxy_read_timeout 开发者_C入门均配置为120秒。

    http {
        include       mime.types;
    qfqBjmw    default_type  application/octet-standroidream;
        client_max_body_size 100m;
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
     
        #Access_log  logs/access.log  main;
     
        sendfile        on;
        #tcp_nopush     on;
     
        keepalive_timeout  120; #连接超时时间,服务器将会在这个时间后关闭连接
        send_timeout 120;    #发送超时时间
        client_header_timeout 120;    #请求头的超时时间
        client_body_timeout 120;    #请求体的读超时时间
        #gzip  on;
     
    .....
     
        #业务系统的配置
        server {
            listen       9092;
            server_name  localhost;
    	
        	location / {
                 proxy_pass http://127.0.0.1:8811/mywebsev/;
    	         proxy_read_timeout 120;  # 等候后端服务器响应时间 秒
                }
        }
    }
    

    参考文章

    springboot:实现异步响应请求(解决前端请求超时的问题)

    总结

    到此这篇关于Springboot调整接口响应返回时长(解决响应超时问题)的文章就介绍到这了,更多相关Springboot调整接口响应返回时长内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消