我一直在尝试找到一个 tomcat 属性来定义请求超时。具体来说,我正在寻找一种方法来限制服务器端请求所花费的时间。
经过一番研究,似乎这是不可能的
无法保证[超时],因为您无法强制停止正在处理请求的线程。
这感觉是设计使然,这让我想知道为什么。
反对拥有这样财产的理由是什么?还是架构的技术限制?
PS:我发现同样的情况也适用于 Tomcat、Httpd,显然还有 wakanda?这就是为什么我的问题是关于一般服务器的。如果我的假设有误,请纠正我。
我一直在尝试找到一个 tomcat 属性来定义请求超时。具体来说,我正在寻找一种方法来限制服务器端请求所花费的时间。
经过一番研究,似乎这是不可能的
无法保证[超时],因为您无法强制停止正在处理请求的线程。
这感觉是设计使然,这让我想知道为什么。
反对拥有这样财产的理由是什么?还是架构的技术限制?
PS:我发现同样的情况也适用于 Tomcat、Httpd,显然还有 wakanda?这就是为什么我的问题是关于一般服务器的。如果我的假设有误,请纠正我。
Java 中没有停止线程的机制
曾经有这样的机制(
Thread.stop()
),但它并不安全,因为它可能使对象处于不一致的状态。这是因为如果线程可能突然停止,则无法保证发生之前的行为。因为线程可能在关键部分的中间停止,所以请参阅为什么 Thread.stop 被弃用?。相反,礼貌地要求停止
您可以尝试这样做
Thread.interrupt()
,但这取决于您的业务逻辑来检查是否这样做Thread.isInterrupted()
。你?可能不会。所以即使你可以设置一些超时,在很多情况下也是行不通的。大多数网络应用程序实际上都是数据库绑定的。意思是,他们大部分时间都花在执行一些请求上。如果您确实想限制请求时间并且您的应用程序也是数据库绑定的,您可以在该级别设置一些超时。例如,C3P0提供了一些超时,如unreturnedConnectionTimeout、checkoutTimeout ,而像PostgeSQL这样的数据库则提供了各种选项,如statements_timeout。
与网络上的任何其他通信相同 - 如果您不想因为防火墙或其他原因而出现挂起的风险,则需要设置connectionTimeout和socketTimeout。像 Spring 的 RestTemplate 这样的工具就有这样的选项。当对方没有回应时,这将有助于解决问题。但如果对方的反应非常缓慢、渐进,那就无济于事了。