У меня есть класс Initializer
, который реализует интерфейс ServletContextListener
. В его методе contextInitialized()
я инициализирую некоторые глобальные классы, которые должны быть уничтожены, иначе сервлет не может быть выгружен.
Однако, когда метод сервлета init()
выдает ServletException
, метод contextDestroyed()
никогда не вызывается -> ресурсы не освобождаются -> сервлет не выгружается Tomcat (он остается в «работающем») состояние, даже если его метод init
не завершен).
У меня вопрос такой - как мне очистить ресурсы в этом случае?
Бонус: почему сервлет даже переходит в состояние «работы»? Из документации я понимаю, что он не должен работать, пока метод init()
не завершится успешно.
Редактировать - Я думаю, это потому, что каждая строка состояния, отображаемая в Tomcat Manager, представляет собой целую войну, а не сервлет. Война может содержать несколько сервлетов, причем некоторые из них должны начаться, а другие нет. Initializer
вызывается при запуске контейнера, а его уничтожение вызывается только тогда, когда весь контейнер сброшен. Это приводит к смежному вопросу - существует ли аналогичный встроенный способ контроля состояния отдельных сервлетов?
(Я знаю, что могу написать собственный код для мониторинга сервлета, либо через JMX, либо нет, но это выходит за рамки
этот вопрос).