Tomcat请求超时

Hor*_*lea 44 java tomcat timeout request java-ee

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

我想在服务器端将请求超时60秒.这是在tomcat中实现的吗?

谢谢,Horatiu

ben*_*y23 44

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

<Context ...>
  ...
  <Valve 
    className="org.apache.catalina.valves.StuckThreadDetectionValve"
    threshold="60" />
  ...
</Context>
Run Code Online (Sandbox Code Playgroud)

这将在tomcat日志中为任何花费超过60秒的线程写入一个WARN条目,这将使您能够识别应用程序并禁止它们,因为它们有问题.

基于源代码,您可以编写自己的阀门来尝试停止线程,但是这会对线程池产生影响,并且没有可靠的方法在Java中停止线程而没有该线程的协作...


Mat*_*ell 23

如果您试图阻止请求运行太长时间,那么在Tomcat中设置超时对您没有帮助.正如Chris所说,您可以为Tomcat设置全局超时值.但是,从Apache Tomcat Connector - Generic HowTo Timeouts,请参阅Reply Timeout部分:

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

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

如果JK中止等待响应,因为响应超时被触发,则无法停止后端处理.虽然您可以在Web服务器中释放处理资源,但请求将继续在后端运行 - 无需任何方式在响应超时触发后发回结果.

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

  • 链接已过时 (4认同)

Chr*_*is 10

您可以在server.xml中设置默认超时

<Connector URIEncoding="UTF-8" 
    acceptCount="100" 
    connectionTimeout="20000" 
    disableUploadTimeout="true" 
    enableLookups="false" 
    maxHttpHeaderSize="8192" 
    maxSpareThreads="75" 
    maxThreads="150" 
    minSpareThreads="25" 
    port="7777" 
    redirectPort="8443"/>
Run Code Online (Sandbox Code Playgroud)

  • connectionTimeout是一旦建立连接,Tomcat将等待http请求行的时间.它不会影响服务器等待请求完成处理的时间 (13认同)
  • 另请参阅 /sf/answers/3176601991/ 显然有一种“类型”的 writeTimeout 您可以控制 FWIW。 (2认同)