Как я могу заставить ServletContextListener остановить приложение Java EE? - PullRequest
10 голосов
/ 12 июля 2011

У меня есть ServletContextListener, который выполняет некоторые функции управления базой данных при запуске моего приложения Java EE. Это выполняется в моем приложении до запуска / загрузки JPA и других частей приложения. Если обслуживание базы данных не удается, я регистрирую ошибки. Если обслуживание базы данных не удается, приложение не будет работать должным образом, и я хотел бы остановить приложение.

Как я могу изящно и правильно остановить приложение из ServletContextListener.contextInitialized?

Решение, данное Вивеном ниже, близко, но не совсем. Когда я выбрасываю RuntimeException, Glassfish остается в несогласованном состоянии, когда его консоль администратора недоступна, но какой-то процесс все еще работает и держит порт 3700 (IIOP?) Открытым, что затем предотвращает перезагрузку.

Ответы [ 2 ]

5 голосов
/ 13 июля 2011

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

На данный момент ваши параметры могут быть продиктованы архитектурой вашего приложения. Если все запросы обрабатываются одним сервлетом контроллера / диспетчера, возможно, имеет смысл, чтобы его метод init проверял атрибуты контекста и выдавал UnavailableException. Просто имейте в виду, что исключение относится только к конкретному сервлету, который его генерирует. Это делает этот подход менее управляемым, если ваше приложение содержит много сервлетов или обеспечивает прямой доступ к другим ресурсам.

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

5 голосов
/ 12 июля 2011

Если ваше ServletContextListener выдает исключение, веб-приложение не будет загружаться правильно, и сервер приложений может заблокировать весь последующий запрос (и ответить с ошибкой 500).

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

После надлежащей проверки в спецификации, это поведение не обязательно в спецификации. Сервер может (не должен ) вернуть 500 ошибок. Поэтому это решение следует использовать осторожно.

См. этот ответ с цитатой из спецификации сервлета.

...