雄猫请求超时

2022-08-31 20:59:09

在我的Web应用程序中,有些请求的持续时间超过20秒。但在某些情况下,代码可能会导致无限循环或类似的东西,从而减慢服务器的速度。

我想在服务器端放置一个60秒的请求超时。这是在tomcat中实现的吗?


答案 1

使用Tomcat 7,您可以添加StuckThreadDetectionValve,这将使您能够识别“卡住”的线程。您可以在要执行检测的应用程序的 Context 元素中设置阀门:

<Context ...>
  ...
  <Valve 
    className="org.apache.catalina.valves.StuckThreadDetectionValve"
    threshold="60" />
  ...
</Context>

这将为任何超过 60 秒的线程写入 tomcat 日志中的 WARN 条目,这将使您能够识别应用程序并禁止它们,因为它们有故障。

根据源代码,您可以编写自己的阀门来尝试停止线程,但是这会对线程池产生连锁反应,并且没有线程合作的可靠方法可以在Java中停止线程...


答案 2

如果您试图防止请求运行太长时间,那么在Tomcat中设置超时将对您没有帮助。正如 Chris 所说,您可以为 Tomcat 设置全局超时值。但是,从 Apache Tomcat 连接器 - 通用操作超时中,请参阅回复超时部分:

JK 还可以在请求回复时使用超时。此超时不测量响应的完整处理时间。相反,它控制连续响应数据包之间允许的时间。

在大多数情况下,这是人们真正想要的。例如,考虑长时间运行的下载。您将无法设置有效的全局答复超时,因为下载可能会持续数分钟。但是,大多数应用程序在开始返回响应之前的处理时间有限。对于这些应用程序,您可以设置显式回复超时。不与回复超时协调的应用程序是批处理类型的应用程序、数据仓库和报告应用程序,它们预计会观察到较长的处理时间。

如果 JK 中止等待响应,因为触发了应答超时,则无法在后端停止处理。尽管您释放了 Web 服务器中的处理资源,但请求将继续在后端运行 - 一旦触发回复超时,就无法发送回结果。

因此,Tomcat 将检测到 servlet 在超时内没有响应,并将响应发回给用户,但不会停止线程运行。我不认为你能实现你想做的事情。


推荐