2009-12-01 4 views
3

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

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

Мой вопрос в том, как я могу очистить ресурсы в этом случае?

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

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

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

ответ

1

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

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

+0

Согласно javadoc [ServletContextListener] (http://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/ServletContextListener.html), contextInitialized метод управляется «до того, как какой-либо фильтр или сервлет в веб-приложении инициализируется», вопреки тому, что прошлое в имени метода может заставить вас поверить. –

1

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

+0

Это ошибка конфигурации/развертывания, а не ошибка программирования. Как я могу контролировать статус сервлетов тогда? – ripper234

+0

Ошибки конфигурации по-прежнему несут ответственность. Мониторинг может быть выполнен только путем чтения журналов. – BalusC

+0

Я не вижу, как это уместно. Часть того, что контролирует наш оператор, - это статус контейнера. Мы думали, что он представляет статус _servlet_, но, кстати, это не так. Единственный вопрос, который остается, заключается в том, должен ли Tomcat останавливать контейнер, если все сервлеты в нем не запускались. – ripper234

0

Какой контейнер вы используете?

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

+0

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

Смежные вопросы