Ошибка запуска приложения Java EE - PullRequest
14 голосов
/ 12 августа 2011

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

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

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

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

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

11.6 Исключения слушателя

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

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

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

Ответы [ 3 ]

2 голосов
/ 24 августа 2012

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

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

1 голос
/ 24 августа 2012

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

0 голосов
/ 15 сентября 2011

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

...