如何配置Spring Boot嵌入式Tomcat连接超时?

时间:2016-08-19 09:41:41

标签: spring tomcat

如果处理请求的时间超过3秒,我希望我的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”,但应该重置。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您要找的是客户端超时。您设置的参数 - setConnectionTimeout setKeepAliveTimeout setSoTimeout - 具有不同的含义。

根据 apache tomcat文档,下面是这些超时的定义:

  

ConnectionTimeout - 此连接器的毫秒数   在接受连接之后,等待请求URI行   呈现

     

KeepAliveTimeout - 此连接器将等待的毫秒数   关闭连接之前的另一个HTTP请求

     

soTimeout - 这相当于标准属性connectionTimeout

这些都不符合您的要求,即:

  1. 考虑处理请求所需的端到端时间
  2. 请求失败,如果该时间超出预设值(在您的情况下为3秒)
  3. 这样的功能需要是http客户端实现的一部分,并且特定于您正在使用的http客户端。

    比如说,如果您使用curl发出http请求,可以使用curl的--max-time选项来指定它,如下所示。

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