Ошибка запуска приложения Java EE

Есть ли способ предотвратить запуск приложения Java EE, если во время инициализации приложения возникает исключение? Я в основном ищу способ заставить приложение войти в состояние "j2ee.state.failed" (за JSR-77) после необработанного исключения выбрано из ServletContextListener или Singleton Startup bean во время инициализации приложения.

спецификация EJB, похоже, указывает, что если во время инициализации Singleton bean возникает исключение, приложение будет продолжать запускаться и работать без ошибок; однако только сам bean может находиться в состоянии, в котором он не может быть вызван. К сожалению, это не то поведение, которое я ищу.

4.8.4 Обработка ошибок Singleton

Ошибки, возникающие при инициализации Singleton, считаются фатальными и должны приводить к отбрасыванию экземпляра Singleton. Возможные ошибки инициализации включают в себя отказ от инъекции, системное исключение, вызванное методом PostConstruct, или отказ метода транзакции PostConstruct, управляемой контейнером, для успешной фиксации. Если синглтон не инициализируется, попытки вызова на Singleton приводят к исключению, как определено в разделе 3.4.3 и разделе 3.4.4.

спецификация сервлета немного более неоднозначна в своих требованиях, по-видимому, не требует, чтобы контейнер вел себя определенным образом, а просто предлагал ( используя термин "может" ), что веб-модуль продолжает запускаться, но любые запросы должны приводить к ошибке внутреннего сервера. Опять же, это, к сожалению, не то поведение, которое я ищу. Почему веб-приложение должно продолжать работать и работать, если оно не может обрабатывать какие-либо запросы?

11.6 Исключения для прослушивателя

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

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

Я пропустил какую-либо часть спецификации, которая предотвратила бы запуск приложения, если во время инициализации возникает исключение?

Ответы

Ответ 1

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

В некоторых проектах мы использовали [nagios] [1] и [rhq] [2] для проверки развертываний. Например, nagios проверяет JBossAS на jmx-консоли для необходимых развертываний. Когда приложение, которое развернуто, не отображается в течение нескольких секунд после развертывания, его персонал уведомляется.

Ответ 2

+1 к ответу мема. И, возможно, это может помочь: в моей комбинации expirience, если bean с аннотациями @Startup и @Singleton выдает исключение в методе @PostConstruct, это предотвращает запуск всего приложения (уха) на JBoss AS 7.1.1

Ответ 3

в случае веб-приложений - почему бы не создать фильтр сервлета, который будет проверять ваш собственный "неудачный" флаг и вернуть 500 для любого запроса, если этот флаг поднят? с точки зрения контейнера, ваше приложение будет запущено, конечно.