Таймаут запроса Tomcat
В моем веб-приложении есть несколько запросов, длительностью более 20 секунд. Но в некоторых ситуациях код может привести к бесконечному циклу или что-то подобное, что замедляет работу сервера.
Я хочу поставить тайм-аут запроса на 60 секунд на стороне сервера. Это реализовано в tomcat?
Спасибо,
Horatiu
Ответы
Ответ 1
С Tomcat 7 вы можете добавить StuckThreadDetectionValve, который позволит вам идентифицировать потоки, которые "застревают". Вы можете настроить клапан в элементе Context приложений, где вы хотите обнаружить:
<Context ...>
...
<Valve
className="org.apache.catalina.valves.StuckThreadDetectionValve"
threshold="60" />
...
</Context>
Это будет записывать WARN-запись в журнал tomcat для любого потока, который занимает больше 60 секунд, что позволит вам идентифицировать приложения и запретить их, потому что они неисправны.
Основываясь на исходный код, вы можете написать свой собственный клапан, который пытается остановить поток, однако это может привести к поломке эффекты на пуле потоков и нет надежного способа остановить поток в Java без сотрудничества с этим потоком...
Ответ 2
Если вы пытаетесь предотвратить слишком длительный запуск запроса, установка тайм-аута в Tomcat вам не поможет. Как говорит Крис, вы можете установить глобальное значение таймаута для Tomcat. Но, из Разъем Apache Tomcat - общий HowTo
Тайм-ауты, см. Раздел "Тайм-аут ответа":
JK также может использовать таймаут по запросу. Этот тайм-аут не измерьте полное время обработки ответа. Вместо этого он контролирует, сколько времени между последовательными пакетами ответов разрешено.
В большинстве случаев это то, что на самом деле нужно. Рассмотрим, например длинные загрузки. Вы не сможете установить эффективную глобальный тайм-аут ответа, поскольку загрузка может длиться много минут. Большинство приложений имеют ограниченное время обработки перед запуском чтобы вернуть ответ. Для этих приложений вы можете установить явный тайм-аут ответа. Приложения, которые не согласуются с ответом тайм-ауты - это пакетные приложения, хранилище данных и отчетность приложений, которые, как ожидается, будут наблюдать длительное время обработки.
Если JK прерывает ожидание ответа, поскольку тайм-аут ответа завершен, нет способа остановить обработку на сервере. Хотя вы свободны обработки ресурсов на вашем веб-сервере, запрос будет продолжать работать на бэкэнд - без какого-либо способа отправить результат после таймаут ответа.
Итак, Tomcat обнаружит, что сервлет не ответил в течение таймаута и отправит ответ пользователю, , но не остановит поток. Я не думаю, что вы можете достичь того, что хотите.
Ответ 3
Вы можете установить время ожидания по умолчанию в файле 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"/>
Ответ 4
В этой статье рассказывается о настройке тайм-аутов на уровне сервера.
http://www.coderanch.com/t/364207/Servlets/java/Servlet-Timeout-two-ways
Что заставляет приложение перейти в бесконечный цикл? Если вы открываете соединения с другими ресурсами, вы можете захотеть установить тайм-ауты на эти соединения и отправить соответствующий ответ, когда произойдет этот тайм-аут.
Ответ 5
Для тех, кто не любит ни одно из решений, опубликованных выше, как я, вы можете просто реализовать таймер самостоятельно и прекратить выполнение запроса, выбросив исключение во время выполнения. Что-то вроде ниже:
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 здесь
Ответ 6
Добавить tomcat в Eclipse
В Eclipse, как сервер tomcat, дважды щелкните "Tomcat v7.0 Server at Localhost", измените свойства, как показано в настройках тайм-аута 45, в любой момент, который вам нравится