2016-08-19 2138 views
1

如果请求正在处理超过3秒钟,我希望我的Spring Boot应用程序使用嵌入式Tomcat重置连接。但是我无法做到这一点。我的最后一个代码片段是:如何配置Spring Boot嵌入式Tomcat连接超时?

@SpringBootApplication 
@ComponentScan(basePackages = {"."}) 
@Controller 
public class ExternalServerApplication { 
    public static void main(String[] args) { 
     SpringApplication.run(ExternalServerApplication.class, args); 
    } 

    @Bean 
    public EmbeddedServletContainerFactory servletContainerFactory() { 
     TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); 

     factory.addConnectorCustomizers(
       connector -> { 
        AbstractProtocol protocol = (AbstractProtocol) connector.getProtocolHandler(); 
        protocol.setConnectionTimeout(1); 
        protocol.setKeepAliveTimeout(1); 
        protocol.setSoTimeout(1); 
        protocol.setPort(8012); 
        protocol.setMaxThreads(10); 
       }); 

     return factory; 
    } 

    @RequestMapping("/request") 
    @ResponseBody 
    public String request() throws InterruptedException { 
     for (int i = 0; i < 50; i++) { 
      Thread.sleep(100); 
     } 
     return "OK"; 
    } 
} 

但它也不起作用。

localhost:8012/requests的请求持续5秒钟并返回“OK”,但它应该被重置。

任何想法?

+0

您是否试过在application.properties中指定server.connection-timeout = 3000? 编辑:另一方面,你写处理请求超时,而在我看来server.connection超时是别的东西(从文档引述:“这个连接器接受连接后,等待的毫秒数要显示的URI行。“) – patrykos91

+0

查看该线程:http:// stackoverflow。com/questions/7145131/tomcat-request-timeout 另一个可以解决你的问题的方法是用Netflix Zuul :) – patrykos91

回答

0

你在找什么是客户端超时。您已设置的参数 - setConnectionTimeout,set保持运行时间,setSoTimeout - 具有不同的含义。

作为每的Apache Tomcat文档,下面是这些超时的定义:

ConnectionTimeout - 毫秒数则此连接器 等待,接受连接,用于请求URI行之后要 呈现

的KeepAliveTimeout - 毫秒数此连接器将等待 为ANOT关闭连接

soTimeout之前她HTTP请求 - 这相当于标准属性connectionTimeout

这些都不匹配您的要求,这就是:

  1. 考虑结束处理请求所花费的时间
  2. 如果该时间超出预设值(3秒,在您的情况下)

这样的功能需要成为http客户端实现的一部分,并且特定于您正在使用的http客户端。

假设例如,如果您使用curl发出http请求,则可以使用curl的--max-time选项来指定此选项,如下所示。

curl --max-time 3 http://localhost:8012/requests 
+0

对不起,但是我无法控制客户端的行为 – corvax

相关问题