Tomcat request timeout

158,207

Solution 1

With Tomcat 7, you can add the StuckThreadDetectionValve which will enable you to identify threads that are "stuck". You can set-up the valve in the Context element of the applications where you want to do detecting:

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

This would write a WARN entry into the tomcat log for any thread that takes longer than 60 seconds, which would enable you to identify the applications and ban them because they are faulty.

Based on the source code you may be able to write your own valve that attempts to stop the thread, however this would have knock on effects on the thread pool and there is no reliable way of stopping a thread in Java without the cooperation of that thread...

Solution 2

If you are trying to prevent a request from running too long, then setting a timeout in Tomcat will not help you. As Chris says, you can set the global timeout value for Tomcat. But, from The Apache Tomcat Connector - Generic HowTo Timeouts, see the Reply Timeout section:

JK can also use a timeout on request replies. This timeout does not measure the full processing time of the response. Instead it controls, how much time between consecutive response packets is allowed.

In most cases, this is what one actually wants. Consider for example long running downloads. You would not be able to set an effective global reply timeout, because downloads could last for many minutes. Most applications though have limited processing time before starting to return the response. For those applications you could set an explicit reply timeout. Applications that do not harmonise with reply timeouts are batch type applications, data warehouse and reporting applications which are expected to observe long processing times.

If JK aborts waiting for a response, because a reply timeout fired, there is no way to stop processing on the backend. Although you free processing resources in your web server, the request will continue to run on the backend - without any way to send back a result once the reply timeout fired.

So Tomcat will detect that the servlet has not responded within the timeout and will send back a response to the user, but will not stop the thread running. I don't think you can achieve what you want to do.

Solution 3

You can set the default time out in the 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"/>
Share:
158,207
Horatiu Jeflea
Author by

Horatiu Jeflea

Backend: Python - Django Java - Spring, Hibernate Node - Express, Typescript Frontend: React Redux Cloud: AWS Azure Heroku Other: Serverless Big Data NLU/Chatbot Startups Articles: https://medium.com/@horatiujeflea Public projects: https://github.com/horatiujeflea CV: LinkedIn Mail: [email protected]

Updated on July 09, 2022

Comments

  • Horatiu Jeflea
    Horatiu Jeflea almost 2 years

    In my web application there are some requests which last longer than 20 seconds. But in some situations the code can lead to infinite loop or something similar which slows down the server.

    I want to put a request timeout for 60 sec on the server side. Is this implemented in tomcat?

  • Horatiu Jeflea
    Horatiu Jeflea almost 13 years
    Is there a way to affect only my application ?
  • Chris
    Chris almost 13 years
    You cant effect the timeout from the server unfortunately AFAIK I may be wrong
  • Horatiu Jeflea
    Horatiu Jeflea almost 13 years
    Perhaps in jboss ? Google app engine has done this, 30 second or something like that
  • thcricketfan
    thcricketfan almost 13 years
    Why is there a markdown on this? The answer is relevant to the question posted there.
  • Serge Wautier
    Serge Wautier over 12 years
    I guess it was voted down because the article is about session timeouts
  • Kaan Yy
    Kaan Yy over 11 years
    Instead of killing that thread (which is not reliable as you mentioned), throwing a runtimeexception is enough
  • Aritz
    Aritz over 10 years
    Are you maybe mixing the server starting timeout with the request timeout itself?
  • Dave
    Dave about 10 years
    The connectionTimeout is how long Tomcat will wait for the http request line once a connection is established. It doesn't affect how long the server waits for the request to finish processing
  • Rodrigo Asensio
    Rodrigo Asensio over 8 years
    question is talking about http request timeout , not the start/stop timeout
  • rogerdpack
    rogerdpack almost 7 years
    See also stackoverflow.com/a/45380028/32453 apparently there is a "kind" of writeTimeout you can control FWIW.