Подтвердить что ты не робот

Таймаут запроса Tomcat

В моем веб-приложении есть несколько запросов, длительностью более 20 секунд. Но в некоторых ситуациях код может привести к бесконечному циклу или что-то подобное, что замедляет работу сервера.

Я хочу поставить тайм-аут запроса на 60 секунд на стороне сервера. Это реализовано в tomcat?

Спасибо, Horatiu

4b9b3361

Ответ 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, в любой момент, который вам нравится