2017-06-17 6 views
2

So habe ich eine Spring-App auf Tomcat ausgeführt. Bei der Initialisierung kann es manchmal zu Fehlern kommen (d. H. Dass ein JDNI-Wert nicht gefunden wird oder die App keine Verbindung zu einem Dienst herstellen kann). Wenn dies passiert, werfe ich eine Exception aus und fange sie in der @Configuration-Datei ab. Im Catch-Block versuche ich die App mit einem System.exit (-1) zu schließen. Aber es scheint nicht der richtige Weg zu sein. Ursache Intellij ist nicht fähig oder schaltet den Server aus, ich habe sogar gesehen, dass Ressourcen nicht freigegeben werden, bis der Server ausgeschaltet ist.Schließen Sie die Feder bei der Initialisierung

Ich habe auch versucht:

@Autowired 
public ApplicationContext application context 
@Bean 
public IServerDataCache serverDataCache() { 
    try { 
     return new ServerDataCache(args); 
    } catch(InitializationError initializationError) { 
     log.error("Unable to load configuration for Server Data Cache. Closing application."); 
     System.exit(1); OR SpringApplication.exit(applicationContext) 
    } 
    return null; 
} 

Sowohl System.exit (1); ODER SpringApplication.exit (applicationContext) scheint den gleichen Effekt zu haben. Irgendeine Idee von einem besseren Weg, um die Finalisierung der Anwendung zu erzwingen.

Übrigens ist es eine Spring-Boot-Anwendung.

Antwort

1

Lassen Sie einfach Ihre @Bean Methode die Ausnahme auslösen. Es wird vom Container aufgefangen und kümmert sich dann um das Aufräumen.

+0

Nur um zu klären, der Vorschlag, so etwas wie dieses: @Bean öffentliche IServerDataCache serverDataCache() throws InitializationError { neue ServerDataCache zurückzukehren (args); } – kewne

+0

Ja, das habe ich gemeint –

1

Obwohl Andy Wilkinson Antwort richtig ist, würde ich nur hinzufügen, dass gerne, da Sie Ihre Anwendung laufen auf Tomcat (und nicht eine eingebettet Tomcat), der Tomcat-Server nicht Abschaltung, wenn die Anwendung kann nicht gestartet werden. Dies geschieht per Entwurf, da Tomcat, wie alle JavaEE-Container, mehrere Anwendungen gleichzeitig ausführen soll.

Wenn der gesamte Prozess angehalten werden soll, wenn die Anwendung fehlschlägt, müssen Sie zur Verwendung eines eingebetteten Containers wechseln.

Verwandte Themen