Убить запрос, занимающий слишком много времени в сервлете Java

У меня есть простое приложение Java Servlet. У него есть несколько конечных точек. Хотя служба работает довольно быстро, я получаю несколько запросов, которые иногда занимают больше времени, чем ожидалось. Каким будет лучший способ убить любые запросы, для обработки которых требуется более ~ 20 секунд?


person Pranav Gadekar    schedule 26.03.2018    source источник


Ответы (1)


Если вы хотите прервать поток обработки запросов и используете Tomcat, вы можете попробовать Клапан обнаружения застрявшей резьбы:

interruptThreadThreshold

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

Обратите внимание, что нет гарантии, что нить оторвется. Обычно это хорошо работает для потоков, застрявших на вводе-выводе или блокировках, но, вероятно, бесполезно в случае бесконечных циклов.

По умолчанию -1, что отключает эту функцию. Чтобы включить его, значение должно быть больше или равно порогу.

Возможно, было бы лучше реализовать автоматический выключатель в клиенте, так как interruptThreadThreshold не гарантируется работа для всех сценариев.

person Karol Dowbecki    schedule 26.03.2018
comment
Привет Кароль, спасибо за ваш ответ. К сожалению, в моей службе работает встроенный сервер Jetty, а не Tomcat. Однако я придумал обходной путь для этого. Я помещаю свой код в задачу таймера и обрабатываю TimeoutException. Надеюсь, это не должно использовать слишком много ресурсов в случае сбоя завершения задачи. - person Pranav Gadekar; 27.03.2018