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请求自动超时,如果过多的时间过去服务请求.
解决方法
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开始:
In Spring MVC there is no way to configure a timeout unless you use async method. With async method one can use spring.mvc.async.request-timeout= to set amount of time (in milliseconds) before asynchronous request handling times out.
我已经设置了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以编程方式配置它.