2009-10-08 2 views
4

У меня есть сервлет init в Tomcat, который загружает критические данные. Иногда приходится прерывать запуск при определенных ошибках.shutdown/undeploy tomcat from Servlet

как я грациозно выключение развернутого приложение/весь сервер приложений, не вызывая System.exit(1)

я хочу, чтобы избежать вызова отключения сервлета через порт, так как это не настроен в моей установке.

могут быть задачи, которые должны быть запущены из слушателей по завершении работы, определенные в web.xml

ответ

7

Прежде всего, вы никогда не должны когда-либо когда-либо когда-либо позвонить System.exit() изнутри контейнера сервлетов, так как там могут быть и другие приложения работая в том же процессе, что и ваш, и было бы невероятно некорректно насильственно убить весь процесс.

Предполагая, что ваш «init servlet» реализует ServletContextListener, в API/интерфейсе не определен формальный сигнал, указывающий на контейнер сервлетов «пожалуйста, отключите приложение». Вы могли бы, однако, выбросить RuntimeException из метода contextInitialized(), который в большинстве контейнеров (по крайней мере, Tomcat) остановит запуск вашего webapp и оставьте его в состоянии «остановлено». Однако я сомневаюсь, что Tomcat продолжит звонить вашим слушателям выключения.

Возможно, вы захотите переосмыслить свой дизайн, чтобы ваша критическая логика данных/выключения не была тесно связана с жизненным циклом контейнера сервлетов.

+0

его больше об отключении нитей утилиты и правильной записи журналов –

+1

Я использовал для совместного использования Tomcat с плохим приложением, которое заканчивается из памяти все время. Когда я это обнаруживаю, я вызываю System.exit (0). Выключение столь же изящно, как и другой подход в Tomcat. –

+1

Ну, если вы получаете OOM, то в этот момент ничего не остается сделать, кроме как отключить JVM. –