如果处理请求的时间超过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”,但应该重置。
有什么想法吗?
答案 0 :(得分:0)
您要找的是客户端超时。您设置的参数 - setConnectionTimeout , setKeepAliveTimeout , setSoTimeout - 具有不同的含义。
根据 apache tomcat文档,下面是这些超时的定义:
ConnectionTimeout - 此连接器的毫秒数 在接受连接之后,等待请求URI行 呈现
KeepAliveTimeout - 此连接器将等待的毫秒数 关闭连接之前的另一个HTTP请求
soTimeout - 这相当于标准属性connectionTimeout
这些都不符合您的要求,即:
这样的功能需要是http客户端实现的一部分,并且特定于您正在使用的http客户端。
比如说,如果您使用curl发出http请求,可以使用curl的--max-time选项来指定它,如下所示。
curl --max-time 3 http://localhost:8012/requests