java – Spring – server.connection-timeout无效
在我的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请求自动超时,如果过多的时间过去服务请求. 解决方法
connection-timeout不适用于长时间运行的请求.当服务器等待客户端说出某些内容时,它确实适用于初始连接.
Tomcat docs(不是Spring Boot)将其定义为此连接器在接受连接后将等待呈现请求URI行的毫秒数[…] 要测试设置server.connection-timeout = 4000我使用netcat连接,我不发送任何HTTP请求/标头.我明白了: $time nc -vv localhost 1234 Connection to localhost 1234 port [tcp/*] succeeded! real 0m4.015s user 0m0.000s sys 0m0.000s 备择方案 1)异步 从brightinventions.pl – Spring MVC Thread Pool Timeouts开始:
我已经设置了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 – request timeout? 2)Servlet过滤器 另一个解决方案是使用servlet过滤器brightinventions.pl – Request timeouts in 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 Stuck螺纹检测阀? Tomcat有一个Stuck Thread Detection Valve,但我不知道是否可以使用Spring Boot以编程方式配置它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |