在我的 application.properties
文件中我有…
server.port=8086
server.connection-timeout=15000
我知道文件正在正确加载,因为服务器正在端口 8086 上运行。
在应用程序中我有一个 RestController
@RestController
class TestController {
@GetMapping()
fun getValues(): ResponseEntity<*> {
return someLongRunningProcessPossiblyHanging()
}
}
当我调用端点时,请求永远不会超时,它只是无限期地挂起。
我错过了什么吗?
注意: 我还被告知 Tomcat 在几分钟内使用此字段,而不是几毫秒(IMO 的不寻常选择)。我尝试将其设置为 server.connection-timeout=1
表示 1 分钟,但这也不起作用。
注意: 我不希望 另一个 HTTP 请求导致先前的请求超时,我希望每个 HTTP 请求都自动超时,如果时间过长无法满足请求。
原文由 Matthew Layton 发布,翻译遵循 CC BY-SA 4.0 许可协议
connection-timeout
不适用于长时间运行的请求。它确实适用于初始连接,当服务器等待客户端说些什么时。Tomcat 文档(不是 Spring Boot)将其定义 为此连接器在接受连接后等待显示请求 URI 行的毫秒数 […]
要测试设置
server.connection-timeout=4000
我使用netcat
连接,我不发送任何 HTTP 请求/标头。我得到:备择方案
1)异步
来自 brightinventions.pl - Spring MVC 线程池超时:
我已经设置了
spring.mvc.async.request-timeout=4000
并且在浏览器中出现超时:请参阅 Spring Boot REST API - 请求超时?
2) 小服务过滤器
另一种解决方案是使用 servlet 过滤器 brightinventions.pl - Spring MVC (Kotlin) 中的请求超时:
3) Tomcat 卡住线程检测阀?
Tomcat 有一个 Stuck Thread Detection Valve ,但我不知道这是否可以使用 Spring Boot 以编程方式配置。