Когда вызывается 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).