Spring-server.connection-timeout不起作用

时间:2018-06-27 15:11:57

标签: java spring spring-boot kotlin

我的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请求都自行超时,也应该花费了很多时间来处理请求。

3 个答案:

答案 0 :(得分:6)

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

替代

1)异步

来自brightinventions.pl - Spring MVC Thread Pool Timeouts

  

在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 - request timeout?

2)Servlet过滤器

另一种解决方案是使用servlet过滤器brightinventions.pl - Request timeouts in Spring MVC(科特林):

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卡住了螺纹检测阀?

Tomcat有一个Stuck Thread Detection Valve,但我不知道是否可以使用Spring Boot以编程方式进行配置。

答案 1 :(得分:2)

来自官方docs

  

server.connection-timeout =#连接器在关闭连接之前等待另一个HTTP请求的时间。如果未设置,则使用连接器的特定于容器的默认值。使用值-1表示没有超时(即无限)。

另一个ref也提到了相同的内容。它应该为您工作。

答案 2 :(得分:0)

  

当我呼叫端点时,请求永不超时,只是无限期地挂起。

server.connection-timeout不是请求超时。对于空闲连接(即已经具有请求/响应对并且服务器正在等待第二个请求的连接)来说,这是超时。本质上,这是服务器端的读取超时。