connection-timeout
不适用于长时间运行的请求。它确实适用于初始连接,当服务器等待客户端说出某些内容时。
Tomcat文档(不是Spring Boot)将其定义为此连接器在接受连接后等待请求URI行显示的毫秒数[...]
为了测试设置,我使用连接并且我不发送任何HTTP请求/标头。我得到:server.connection-timeout=4000
netcat
$ time nc -vv localhost 1234
Connection to localhost 1234 port [tcp/*] succeeded!
real 0m4.015s
user 0m0.000s
sys 0m0.000s
选择
1) 异步
从 brightinventions.pl - 春季 MVC 线程池超时:
在Spring MVC中,除非您使用异步方法,否则无法配置超时。使用异步方法,可以使用 spring.mvc.async.request-timeout= 来设置异步请求处理超时之前的时间量(以毫秒为单位)。
我已经设置了,我在浏览器中得到了一个超时:这样:spring.mvc.async.request-timeout=4000
@GetMapping("/test-async")
public Callable<String> getFoobar() {
return () -> {
Thread.sleep(12000); //this will cause a timeout
return "foobar";
};
}
请参阅 Spring Boot REST API - 请求超时?
2) Servlet 过滤器
另一种解决方案是使用 servlet 过滤器 brightinventions.pl - 在 Spring MVC (Kotlin) 中请求超时:
override fun doFilterInternal(request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain) {
val completed = AtomicBoolean(false)
val requestHandlingThread = Thread.currentThread()
val timeout = timeoutsPool.schedule({
if (completed.compareAndSet(false, true)) {
requestHandlingThread.interrupt()
}
}, 5, TimeUnit.SECONDS)
try {
filterChain.doFilter(request, response)
timeout.cancel(false)
} finally {
completed.set(true)
}
}
3)雄猫卡住螺纹检测阀?
Tomcat有一个卡住的线程检测阀,但我不知道是否可以使用Spring Boot以编程方式配置。