2012-12-18 6 views
8

Mam klasy implementującej ServletContextListener, który ładuje niektóre zasoby podczas uruchamiania.Jak przerwać uruchamianie Tomcat po wyjątku w ServletContextListener?

Te zasoby mają krytyczne znaczenie dla aplikacji w taki sposób, że chciałbym zakończyć cały proces uruchamiania, gdy w mojej logice wystąpi jakieś złe zdarzenie.

Czy istnieje polecenie, które można wykonać z poziomu metody ServletContextListener.contextInitialized() w celu zatrzymania i niepowodzenia całego uruchomienia Tomcat?

+0

Czy ktoś znaleźć sposób inny niż System.exit (1)? – Bastien

+0

@Bastien, użyj SpringBoot –

+2

@Leo Irrelevant. Poprawną odpowiedzią na to pytanie będzie wyjaśnienie, w jaki sposób SpringBoot zarządza tym problemem. – Bastien

Odpowiedz

11

spróbuj podać:

-Dorg.apache.catalina.startup.EXIT_ON_INIT_FAILURE=true 

w opcji uruchomieniowych java, cytując official documentation:

Jeśli to prawda, że ​​serwer zostanie zamknięty jeśli wyjątek dzieje się w fazie inicjalizacji serwera.

Jeśli nie zostanie podana, zostanie użyta wartość domyślna false.

UPDATE:

Jeśli chcesz zrobić to za pomocą kodu, będzie System.exit() praca?

public class FailFastListener implements ServletContextListener { 

    private static final Logger log = LoggerFactory.getLogger(FailFastListener.class); 

    @Override 
    public void contextInitialized(ServletContextEvent servletContextEvent) { 
     try { 
      //initialization 
     } catch(Exception e) { 
      log.error("Sooo bad, shutting down", e); 
      System.exit(1); 
     } 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent servletContextEvent) { 
    } 
} 

Można użyć wzór zawinąć dotychczasowych słuchaczy bez ich zaśmiecania. Nie jestem pewien, jak Tomcat zareaguje ...

+0

Dzięki, że prawie rozwiązuje mój problem, ale ... Szukam tego poprzez wykonanie kodu. Jeśli to niemożliwe - użyję opcji runtime opt. – urir

+1

@urir: zobacz moją aktualizację –

+0

Tak :) magiczny System.exit (1) :) Wiem, powinienem postawić pytania w jaśniejszy sposób ... tak ... Jakikolwiek sposób to zrobić poprzez pobranie kontenera Tomcat ? Główny powód, dla którego obawiam się, że System.exit nie zamknie innych zdarzeń w cyklu życia, takich jak kod "zniszcz" innych słuchaczy ... Co o tym sądzisz? – urir

0

Jeśli chcesz zatrzymać Tomcat, ponieważ nie udało się wdrożyć aplikacji, zakładam, że nie masz zainstalowanych innych aplikacji do tomcat. W takim razie dlaczego nie stworzysz tej aplikacji jako samodzielnej aplikacji internetowej z wbudowanym Tomcat/Jetty? W ten sposób, dopóki twoja aplikacja nie uruchomi się poprawnie, serwer wbudowany również się wyłączy.

Dla mnie wygląda na to, że koncentrujesz się na ServletContextListener, aby rozwiązać problem, który nie jest przeznaczony dla ServletContextListener.

Nie używaj System.exit(), ponieważ zabije serwer, na którym mogą być uruchamiane inne wdrożone aplikacje. Jeśli wszystko jest w porządku, ponieważ wiesz, że nigdy nie będziesz mieć innych aplikacji (i nie chcesz), a następnie stwórz samodzielną aplikację internetową. Ta zła praktyka jest wymieniona w CWE jako potencjalna słabość: CWE-382

Tylko podpowiedź: wiosenny rozruch ułatwia budowanie samodzielnej aplikacji webowej z wbudowanym serwerem. Zobacz ten przewodnik: https://spring.io/guides/gs/spring-boot/

dobry artykuł wyjaśniający, dlaczego to jest chyba to, czego szukasz: http://www.beyondjava.net/blog/application-servers-sort-of-dead/

+0

Downvoter ... czy mógłbyś proszę wyjaśnić, dlaczego? –

+0

Witam, dowiaduję się, co z tego? http://cwe.mitre.org/data/definitions/382.html –

+1

Przegłosowałem ciebie, ponieważ generalnie masz rację, ale Tomcat jest szczególnym przypadkiem, ponieważ wbudowany tomcat nie zawsze jest naprawdę osadzony ... to jest wiele programów ładujących klasy są nadal używane. Na przykład wtyczka Tomcat Maven zamieni pojedynczą WAR w plik wykonywalny JAR **, ale ** faktycznie działa bardzo podobnie do normalnego Tomcat. Spring Boot nie robi tego, ponieważ jest rodzicem i Tomcat działa w tym samym programie ładującym klasy. W rzeczywistości istnieje korzyść z posiadania wielu programów ładujących klasy (sposób wtyczki tomcat maven), ponieważ można uniknąć problemów z słoikami Tomcats (takimi jak wybór w logowaniu). –