加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Spring – server.connection-timeout无效

发布时间:2020-12-15 00:39:25 所属栏目:Java 来源:网络整理
导读:在我的application.properties文件中,我有…… server.port=8086server.connection-timeout=15000 我知道文件正在正确加载,因为服务器在端口8086上运行. 在应用程序中我有一个RestController @RestControllerclass TestController { @GetMapping() fun getVa
在我的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开始:

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以编程方式配置它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读