У меня есть класс Initializer
, который реализует интерфейс ServletContextListener
. В своем методе contextInitialized()
я инициализирую некоторые глобальные классы, которые необходимо уничтожить, иначе сервлет не может быть выгружен.Очистка после сервлета, если init() не удалось
Однако, когда init()
метод сервлета бросает ServletException
, то contextDestroyed()
метод никогда не вызывается -> ресурсы не отпускают -> сервлет не разгружаться через Tomcat (он остается в «бегущей» состоянии, даже если его init
метод никогда не завершался).
Мой вопрос в том, как я могу очистить ресурсы в этом случае?
Бонус: почему сервлет даже попадает в состояние «работает»? Я понимаю от the documentation, что он не должен работать, пока метод init()
не завершится успешно.
Редактировать - Я думаю, это потому, что каждая строка состояния, отображаемая в Tomcat Manager, представляет собой целую войну, а не сервлет. Война может содержать несколько сервлетов, некоторые из которых могут начать, а другие нет. При запуске контейнера вызывается Initializer
, а его уничтожение вызывается только при отбрасывании всего контейнера. Это приводит к связанному с этим вопросу - существует ли аналогичный встроенный способ контроля состояния отдельных сервлетов?
(Я знаю, что могу написать собственный код для мониторинга сервлета, либо через JMX, либо нет, но это вне области этот вопрос).
Согласно javadoc [ServletContextListener] (http://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/ServletContextListener.html), contextInitialized метод управляется «до того, как какой-либо фильтр или сервлет в веб-приложении инициализируется», вопреки тому, что прошлое в имени метода может заставить вас поверить. –