Безопасно ли использовать java.util.Timer внутри сервлета? - PullRequest
6 голосов
/ 25 декабря 2009

По многим причинам не рекомендуется использовать потоки внутри сервлета.

java.util.Timer похоже на обертку вокруг нити. Итак, это также не безопасно использовать? Если это так, какой самый безопасный способ запланировать задачу в сервлете?

Ответы [ 2 ]

9 голосов
/ 25 декабря 2009

Да, вы можете использовать таймеры.

Одна важная вещь, которую следует запомнить, это отменить таймер , когда сервлет остановлен. Если вы забудете отменить таймер, ваше веб-приложение будет страдать от утечек памяти (утечки из загрузчика классов, поскольку поток таймера связан с WebappClassLoader через свой ContextClassLoader) и не может быть развернут несколько раз.

2 голосов
/ 25 декабря 2009

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

например. Распространенный шаблон - порождение длинного потока обработки. Запросы сервлета помещают рабочие элементы в очередь (для внеполосной обработки), и длительный поток обработки обрабатывает эти рабочие элементы.

Вот статья из OReilly , подробно описывающая использование таймера в сервлетах и ​​EJB.

...