Очистить после сервлета, если init () не удалось - PullRequest
3 голосов
/ 01 декабря 2009

У меня есть класс Initializer, который реализует интерфейс ServletContextListener. В его методе contextInitialized() я инициализирую некоторые глобальные классы, которые должны быть уничтожены, иначе сервлет не может быть выгружен.

Однако, когда метод сервлета init() выдает ServletException, метод contextDestroyed() никогда не вызывается -> ресурсы не освобождаются -> сервлет не выгружается Tomcat (он остается в «работающем») состояние, даже если его метод init не завершен).

У меня вопрос такой - как мне очистить ресурсы в этом случае?

Бонус: почему сервлет даже переходит в состояние «работы»? Из документации я понимаю, что он не должен работать, пока метод init() не завершится успешно.

Редактировать - Я думаю, это потому, что каждая строка состояния, отображаемая в Tomcat Manager, представляет собой целую войну, а не сервлет. Война может содержать несколько сервлетов, причем некоторые из них должны начаться, а другие нет. Initializer вызывается при запуске контейнера, а его уничтожение вызывается только тогда, когда весь контейнер сброшен. Это приводит к смежному вопросу - существует ли аналогичный встроенный способ контроля состояния отдельных сервлетов?

(Я знаю, что могу написать собственный код для мониторинга сервлета, либо через JMX, либо нет, но это выходит за рамки этот вопрос).

Ответы [ 3 ]

1 голос
/ 03 декабря 2009

Насколько я могу судить, нет абсолютно никакого способа сделать это без внешнего запроса. ServletContextListener дает правильный сигнал (когда все сервлеты были инициализированы - успешно или нет), но вы не можете перечислить все сервлеты в контексте, чтобы проверить их состояние, поскольку соответствующие методы ServletContext устарели и теперь возвращают пустой перечислитель. *

Короче говоря, единственный способ сделать это - через нестандартный API; в частности, это почти тривиально, используя Tomcat JMX API, который я бы рекомендовал.

1 голос
/ 01 декабря 2009

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

0 голосов
/ 01 декабря 2009

В каком контейнере вы работаете?

Например, Tomcat поддерживает JMX . Вы всегда можете написать свой собственный JMX-бин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...