当前位置: 首页 > 知识库问答 >
问题:

Spring - 服务器.连接超时不起作用

丌官盛
2023-03-14

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

server.port=8086
server.connection-timeout=15000

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

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

@RestController
class TestController {
    @GetMapping()
    fun getValues(): ResponseEntity<*> {
        return someLongRunningProcessPossiblyHanging()
    }
}

当我调用endpoint时,请求永远不会超时,它只是无限期地挂起。

我错过了什么吗?

注意:我还被告知,Tomcat使用这个字段是以分钟为单位,而不是以毫秒为单位(这在我看来是相当不寻常的选择)。我试着将它设置为< code > server . connection-time out = 1 表示1分钟,但这也不起作用。

注意:我不希望另一个HTTP请求导致前一个请求超时,我希望每个HTTP请求都自行超时,因为需要太多时间来处理请求

共有3个答案

易祯
2023-03-14

当我调用endpoint时,请求永远不会超时,它只是无限期地挂起。

服务器。连接超时不是请求超时。这是空闲连接的超时,即那些已经有请求/响应对并且服务器现在正在等待第二个请求的连接。它本质上是服务器端读取超时。

邢炯
2023-03-14

来自官方文档:

服务器连接超时=#连接器在关闭连接之前等待另一个HTTP请求的时间。未设置时,将使用连接器的容器特定默认值。使用值-1表示无(即无限)超时。

另一个裁判,也提到了同样的。它应该对你有用。

程承恩
2023-03-14

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

Tomcat docs(不是Spring Boot)将其定义为连接器在接受连接后等待请求URI线路出现的毫秒数[...]

为了测试设置< code > server . connection-time out = 4000 ,我使用< code>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线程池超时:

在SpringMVC中,除非使用异步方法,否则无法配置超时。使用异步方法,可以使用spring.mvc.async。请求超时=设置异步请求处理超时之前的时间量(以毫秒为单位)。

我已经设置了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-请求超时?

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)
    }
}

3) Tomcat卡住Thread检测阀?

Tomcat有一个卡住的线程检测阀,但我不知道是否可以使用Spring Boot进行编程配置。

 类似资料:
  • 我使用快速和连接超时中间件来处理超时。 它工作得很好,但是我默认的服务器的超时设置为两分钟。 因此,如果我想将超时中间件设置为大于两分钟的值,我还必须将http服务器超时增加到稍大一点(否则我的连接超时处理程序不会被调用) 我怎样才能避免这种情况?我错过什么了吗?

  • 当我尝试使用套接字将物理设备连接到服务器时,我遇到了一个问题。在服务器端,它似乎不接受任何连接,而在客户端,套接字超时。你知道为什么会这样吗? 我在下面提供我的代码 服务器代码: 客户端: 11-16 23:32:11.016:W/系统。错误(24213):java.net。ConnectException:无法连接到/192.168.1.116(端口9090):连接失败:ETIMEDOUT(连接

  • 我有一个ldap服务器,我想在这个ldap中使用spring security。我的连接配置是: 我的错误是什么?

  • 问题内容: 尝试通过以下代码连接到 openfire 服务器时: 我得到一个异常说: 这可能是什么原因? 注意 :我已经允许openfire消防服务器通过防火墙。我也尝试过关闭防火墙,但是结果相同。服务器是我自己的机器。我尝试在其上运行程序的同一台计算机。 问题答案: 您可以使用 或者如果您想指定端口 或类似,默认为端口5222

  • 我目前正在使用php。我想将PHP与sql服务器连接,但它不能在生产服务器上工作。它在我的本地机器上工作得很好,因为我在php的扩展文件夹中安装了sql服务器驱动程序,并在php-ini文件中激活了它。我确认驱动程序已经加载到生产驱动程序中,因为它托管在windows服务器中,而不是linux服务器中。我需要帮助,因为相同的脚本,我连接我的本地机器到云sql服务器是相同的脚本,我现在使用连接PHP

  • 所以我有我的 Amazon RDS 实例,我允许我的 EC2 组让所有内容都连接,并且可以在脚本从我自己的机器运行时(使用 XAMPP 安装)完全建立 PDO 连接。 然而,当我从服务器上运行时,我得到一个 错误 从我自己的机器上运行脚本时不会出现此错误,我可以在那里很好地连接到数据库,进行插入和选择等。但是一旦我在我的实际EC2服务器上,blip总是无法连接。此外,它无法连接到任何MySQL实例