2011-08-12 10 views
14

Czy istnieje sposób zapobiegania uruchamianiu aplikacji Java EE w przypadku wystąpienia wyjątku podczas inicjowania aplikacji? Po prostu szukam sposobu, aby spowodować, że aplikacja wejdzie w stan "j2ee.state.failed" (na JSR-77) po nieobsługiwanym wyjątku wyrzuconym z fasoli ServletContextListener lub SingletonStartup podczas inicjowania aplikacji.Błąd uruchamiania aplikacji Java EE

Wydaje się, że EJB specification wskazuje, że jeśli wystąpi wyjątek podczas inicjowania komponentu bean Singleton, aplikacja będzie nadal uruchamiana i uruchamiana bez błędu; jednak tylko sama fasola może znajdować się w stanie, w którym nie można jej wywołać. Niestety nie jest to zachowanie, którego szukam.

4.8.4 Singleton obsługi błędów

błędy występujące podczas inicjalizacji Singleton uważa się krytyczny i może to prowadzić do wyrzucania instancji Singleton. Możliwe błędy inicjalizacji obejmują błąd iniekcji, wyjątek systemowy zgłoszony w metodzie PostConstruct lub niepowodzenie metody zarządzania transakcją zarządzaną przez kontener w celu pomyślnego zatwierdzenia. Jeśli pojedyncza inicjalizacja nie powiedzie się, próba wywołania w Singletonie spowoduje wyjątek zdefiniowany w sekcji 3.4.3 i sekcji 3.4.4.

Servlet specification jest bardziej niejednoznaczna wymogami, pozornie nie wymaga pojemniku zachowywać się w jakiś szczególny sposób, ale jedynie sugeruje (poprzez zastosowanie terminu „may”), które w sieci moduł nadal się uruchamia, ale wszelkie żądania powinny skutkować wewnętrznym błędem serwera. Ponownie, nie jest to nie zachowanie, którego szukam. Dlaczego aplikacja internetowa powinna się nadal uruchamiać i wydawać się uruchomiona, jeśli nie może obsłużyć żadnych żądań?

11,6 słuchaczy wyjątkami

Pojemnik może odpowiedzieć na wszystkich kolejnych żądań do aplikacji WWW z kodem stanu HTTP 500 wskazuje błąd aplikacji.

Z doświadczenia wiem, że serwery aplikacji radzą sobie z tym wymaganiem w różny sposób. Niektóre pojemniki w rzeczywistości uniemożliwiają uruchomienie aplikacji w tych przypadkach, podczas gdy inne będą jedynie tłumić wyjątek i odpowiadać na żądania z 500 błędami, zgodnie z sugestią podaną w specyfikacji.

Czy mogę pominąć jakąkolwiek część specyfikacji, która uniemożliwi uruchomienie aplikacji, jeśli wystąpi wyjątek podczas inicjowania?

+0

+1; dobre pytanie. To także moje doświadczenie - robią to inaczej ... – home

Odpowiedz

0

w przypadku aplikacji internetowych - dlaczego nie utworzyć filtru serwletów, który sprawdzi flagę "nie powiodło się" i zwróci 500 za każde żądanie, jeśli ta flaga zostanie podniesiona? z punktu widzenia kontenera twoja aplikacja zostanie oczywiście uruchomiona.

+0

Celem jest zapobieganie uruchomieniu aplikacji w nieprawidłowym stanie. ServletContainerListeners i Singleton Startup bean są często używane do inicjalizacji wymaganych do działania aplikacji; jeśli podczas tej inicjalizacji wystąpi błąd, idealnym stanem będzie szybka awaria. Zapobiega to tym, że użytkownicy wykrywają awarie, natychmiast zwracając uwagę administratora. Umożliwiłoby to również niezależnym od aplikacji narzędziom do wdrażania, aby powszechnie wykrywać awarie uruchamiania aplikacji i odpowiednio się zachowywać; na przykład poprzez wycofanie aktualizacji aplikacji. – shelley

2

Myślę, że to zależy od serwera aplikacji, którego używasz. Od niego zależy, jak postępować z wdrożeniami o nieprawidłowym stanie. Wdrożenia nie są aktywne, gdy ulegają awarii, więc musisz dostarczyć usługę, która szuka wskazówek, które powinna zapewnić instalacja po pomyślnym uruchomieniu. Jeśli nie, możesz powiadomić administratorów. Ale to wszystko zależy od serwera lub potrzebuje zewnętrznego narzędzia.

W niektórych projektach używaliśmy [nagios] [1] i [rhq] [2] do sprawdzania wdrożeń. Np. Nagios sprawdza JBossAS konsolę jmx dla potrzebnych wdrożeń. Kiedy aplikacja, która jest wdrożona, nie zostanie pokazana w ciągu kilku sekund po wdrożeniu, personel jest powiadamiany.

+0

Tomcat 7.x nie uruchomi aplikacji, która zgłasza niezaznaczony wyjątek z 'ServletContextListener.contextInitialized()', natomiast WebLogic 12.1.3 uruchomi aplikację. – javabrett

1

+1 do odpowiedzi mema. I może to może pomóc: w mojej kombinacji doświadczeń, jeśli komponent bean z adnotacjami @Startup i @Singleton zgłasza wyjątek w metodzie @PostConstruct, uniemożliwia rozpoczęcie całej aplikacji (ucha) na JBoss AS 7.1.1

+2

Podobnie na serwerze WebSphere Application Server 8.0+. –