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

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

39 голосов
/ 22 августа 2011

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

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

Спасибо, Horatiu

Ответы [ 6 ]

43 голосов
/ 20 сентября 2011

С Tomcat 7 вы можете добавить StuckThreadDetectionValve , который позволит вам идентифицировать "застрявшие" потоки. Вы можете настроить клапан в элементе контекста тех приложений, для которых вы хотите определить:

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

Это будет записывать запись WARN в журнал tomcat для любого потока, который занимает более 60 секунд, что позволит вам идентифицировать приложения и запретить их, потому что они неисправны.

Исходя из исходного кода , вы можете написать свой собственный клапан, который пытается остановить поток, однако это может повлиять на пул потоков, и надежного способа не существует остановки потока в Java без сотрудничества с этим потоком ...

22 голосов
/ 14 сентября 2011

Если вы пытаетесь помешать выполнению запроса слишком долго, то установка таймаута в Tomcat вам не поможет.Как говорит Крис, вы можете установить значение глобального таймаута для Tomcat.Но из Соединитель Apache Tomcat - общие тайм-ауты HowTo см. Раздел «Тайм-аут ответа»:

JK также может использовать тайм-аут при ответах на запросы.Этот тайм-аут не измеряет полное время обработки ответа.Вместо этого он контролирует, сколько времени между последовательными ответными пакетами разрешено.

В большинстве случаев это именно то, что действительно нужно.Рассмотрим, например, длительные загрузки.Вы не сможете установить эффективный глобальный тайм-аут ответа, поскольку загрузка может длиться много минут.Однако большинство приложений имеют ограниченное время обработки, прежде чем возвращать ответ.Для этих приложений вы можете установить явное время ожидания ответа.Приложения, которые не согласуются с тайм-аутами ответа, являются приложениями пакетного типа, хранилищами данных и отчетами, которые, как ожидается, будут наблюдать длительное время обработки.

Если JK прерывает ожидание ответа из-за истечения времени ожидания ответа,нет никакого способа остановить обработку на бэкэнде.Несмотря на то, что вы освобождаете ресурсы обработки на своем веб-сервере, запрос будет продолжать выполняться на бэкэнде - без возможности отправить результат после истечения времени ожидания ответа.

Таким образом, Tomcat обнаружитчто сервлет не ответил в течение тайм-аута и отправит ответ пользователю , но не остановит поток, выполняющий .Я не думаю, что вы можете достичь того, что вы хотите сделать.

10 голосов
/ 22 августа 2011

Вы можете установить время ожидания по умолчанию в 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"/>
1 голос
/ 19 сентября 2011

В этой статье рассказывается об установке тайм-аутов на уровне сервера. http://www.coderanch.com/t/364207/Servlets/java/Servlet-Timeout-two-ways

Что заставляет приложение идти в бесконечный цикл? Если вы открываете соединения с другими ресурсами, возможно, вы захотите установить тайм-ауты для этих соединений и отправить соответствующий ответ по истечении этого времени.

0 голосов
/ 20 июля 2015

Для тех, кому не нравится ни одно из приведенных выше решений, таких как я, вы можете просто самостоятельно внедрить таймер и остановить выполнение запроса, вызвав исключение времени выполнения.Примерно так:

                  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 здесь

0 голосов
/ 11 января 2014

Добавить кота в Eclipse

В Eclipse, в качестве сервера tomcat, дважды щелкните «Сервер Tomcat v7.0 на локальном хосте». Измените свойства, как показано в настройках тайм-аута 45, на любое значение, которое вам нравится

...