Tomcat request timeout
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"/>
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, 2022Comments
-
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 almost 13 yearsIs there a way to affect only my application ?
-
Chris almost 13 yearsYou cant effect the timeout from the server unfortunately AFAIK I may be wrong
-
Horatiu Jeflea almost 13 yearsPerhaps in jboss ? Google app engine has done this, 30 second or something like that
-
thcricketfan almost 13 yearsWhy is there a markdown on this? The answer is relevant to the question posted there.
-
Serge Wautier over 12 yearsI guess it was voted down because the article is about session timeouts
-
Kaan Yy over 11 yearsInstead of killing that thread (which is not reliable as you mentioned), throwing a runtimeexception is enough
-
Aritz over 10 yearsAre you maybe mixing the server starting timeout with the request timeout itself?
-
Dave about 10 yearsThe 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 over 8 yearsquestion is talking about http request timeout , not the start/stop timeout
-
rogerdpack almost 7 yearsSee also stackoverflow.com/a/45380028/32453 apparently there is a "kind" of writeTimeout you can control FWIW.