gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:01:41 25 4
gpt4 key购买 nike

如果处理请求的时间超过 3 秒,我希望带有嵌入式 Tomcat 的 Spring Boot 应用程序重置连接。但是我没有办法那样做。我的最后一个代码片段是:

@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”,但应该重新设置。

有什么想法吗?

最佳答案

您正在寻找的是客户端超时。您设置的参数 - setConnectionTimeoutsetKeepAliveTimeoutsetSoTimeout - 具有不同的含义。

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

ConnectionTimeout - The number of milliseconds this Connector will wait, after accepting a connection, for the request URI line to be presented

KeepAliveTimeout - The number of milliseconds this Connector will wait for another HTTP request before closing the connection

soTimeout - This is equivalent to standard attribute connectionTimeout

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

  1. 考虑处理请求所需的端到端时间
  2. 如果该时间超过预设值(在您的情况下为 3 秒),则请求失败

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

比如说,如果你使用curl来发起http请求,你可以使用curl的--max-time选项来指定这个,如下所示。

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

关于spring - 如何配置Spring Boot嵌入式Tomcat连接超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39035832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com