У меня есть простое приложение Java Servlet. У него есть несколько конечных точек. Хотя служба работает довольно быстро, я получаю несколько запросов, которые иногда занимают больше времени, чем ожидалось. Каким будет лучший способ убить любые запросы, для обработки которых требуется более ~ 20 секунд?
Убить запрос, занимающий слишком много времени в сервлете Java
Ответы (1)
Если вы хотите прервать поток обработки запросов и используете Tomcat, вы можете попробовать Клапан обнаружения застрявшей резьбы:
interruptThreadThreshold
Минимальная продолжительность в секундах, по истечении которой застрявший поток следует прервать, чтобы попытаться освободить его.
Обратите внимание, что нет гарантии, что нить оторвется. Обычно это хорошо работает для потоков, застрявших на вводе-выводе или блокировках, но, вероятно, бесполезно в случае бесконечных циклов.
По умолчанию -1, что отключает эту функцию. Чтобы включить его, значение должно быть больше или равно порогу.
Возможно, было бы лучше реализовать автоматический выключатель в клиенте, так как interruptThreadThreshold
не гарантируется работа для всех сценариев.
person
Karol Dowbecki
schedule
26.03.2018
Привет Кароль, спасибо за ваш ответ. К сожалению, в моей службе работает встроенный сервер Jetty, а не Tomcat. Однако я придумал обходной путь для этого. Я помещаю свой код в задачу таймера и обрабатываю TimeoutException. Надеюсь, это не должно использовать слишком много ресурсов в случае сбоя завершения задачи.
- person Pranav Gadekar; 27.03.2018