Когда вызывается contextDestroyed?
Внедрив ContextListener
, я теперь могу с радостью справиться с событиями contextDestroyed
, закрыв пулы подключений и очистив свои кэши и т.д.
Недавно я был удивлен, когда contextDestroyed
был вызван в то время, когда мой сервер не закрывался - казалось, что в какое-то произвольное время я не смог отследить.
Есть ли определенное событие или множество обстоятельств, которые вызывают contextDestroyed
?
Должен ли я гарантировать, что все, что я делаю, когда вызывается contextDestroyed
, является обратимым? Должен ли я заставить все мои бассейны выжить в цикле destroyed/initialized
? Я ошибался, полагая, что я бы получил только contextDestroyed
, когда Tomcat был закрыт или заменен мой war
?
Ответы
Ответ 1
Через серию проб и ошибок я обнаружил, что contextDestroyed()
вызывается, когда;
- Сервер
.WAR
обновляется/удаляется.
- Сервер отключается из-за вмешательства администратора.
- Сервер отключается из-за ошибки кодирования. Что-то, что
прекратить не-серверное завершение приложения.
Если вы столкнулись с проблемой № 3, как вы предлагаете, я думаю, что наилучшим способом действий является безопасный (не забудьте создать бесконечный цикл) вызов contextInitialized()
, чтобы обеспечить правильное воссоздание пулов.
Ответ 2
Смотрите: http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html
contextDestroyed (ServletContextEvent sce): получает уведомление, которое ServletContext будет закрыт.
I.e., он вызывается, когда веб-приложение выгружается (например, вы удаляете или заменяете файл .war из папки веб-приложений или выгружаете его с помощью сервера-менеджера Tomcat).