Spring - server.connection-timeout无效

ser*_*0ne 15 java spring kotlin spring-boot

在我的application.properties文件中,我有......

server.port=8086
server.connection-timeout=15000
Run Code Online (Sandbox Code Playgroud)

我知道文件正在正确加载,因为服务器在端口8086上运行.

在应用程序中,我有一个 RestController

@RestController
class TestController {
    @GetMapping()
    fun getValues(): ResponseEntity<*> {
        return someLongRunningProcessPossiblyHanging()
    }
}
Run Code Online (Sandbox Code Playgroud)

当我调用端点时,请求永远不会超时,它只是无限期挂起.

我错过了什么吗?

注意:我也被告知Tomcat在几分钟内使用此字段,而不是毫秒(相当不寻常的选择IMO).我已经尝试将其设置为server.connection-timeout=1表示1分钟,但这也不起作用.

注意:我不希望另一个 HTTP请求导致先前的请求超时,我希望每个HTTP请求自己超时,如果过多的时间过去服务请求.

And*_*ete 12

connection-timeout不适用于长时间运行的请求。当服务器等待客户端说些什么时,它确实适用于初始连接。

Tomcat文档(不是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
Run Code Online (Sandbox Code Playgroud)

备择方案

1)异步

brightinventions.pl-Spring 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";
   };
}
Run Code Online (Sandbox Code Playgroud)

请参阅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)
    }
}
Run Code Online (Sandbox Code Playgroud)

3)雄猫卡死了螺纹检测阀?

Tomcat有一个“ 阻塞线程检测阀”,但我不知道是否可以使用Spring Boot以编程方式进行配置。