Tomcat请求超时

时间:2011-08-22 08:58:19

标签: java tomcat java-ee request timeout

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

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

谢谢你, 霍拉丘

6 个答案:

答案 0 :(得分:42)

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

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

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

基于source code,您可以编写自己的阀门来尝试停止线程,但是这会对线程池产生影响,并且no reliable way会停止线程在Java中没有该线程的合作......

答案 1 :(得分:21)

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

  

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

     

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

     

如果JK中止等待响应,因为触发了回复超时,   没有办法停止后端处理。虽然你有空   处理您的Web服务器中的资源,请求将继续   在后端运行 - 没有任何方法一旦发送回结果   回复超时已解雇。

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

答案 2 :(得分:9)

您可以在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"/>

答案 3 :(得分:1)

本文讨论在服务器级别设置超时。 http://www.coderanch.com/t/364207/Servlets/java/Servlet-Timeout-two-ways

是什么导致应用程序进入无限循环?如果要打开与其他资源的连接,则可能需要在这些连接上设置超时,并在发生超时时发送适当的响应。

答案 4 :(得分:0)

对于那些不喜欢上面发布的解决方案的人,我可以自己实现一个计时器,并通过抛出运行时异常来停止执行请求。如下所示:

                  try 
                 {
                     timer.schedule(new TimerTask() {
                       @Override
                       public void run() {
                         timer.cancel();
                       }
                     }, /* specify time of the requst */ 1000);
                 }
                 catch(Exception e)
                 {
                   throw new RuntimeException("the request is taking longer than usual");
                 }

或者最好使用java guava timeLimiter here

答案 5 :(得分:-7)

在Eclipse中添加tomcat

在Eclipse中,作为tomcat服务器,双击“Tomcat v7.0 Server at Localhost”,将超时设置45中显示的属性更改为您喜欢的任何一个区域