Annullare java webapp all'avvio
-
07-07-2019 - |
Domanda
La mia webapp fa parte di un EAR più grande che viene distribuito in un server websphere. Il server ospita il numero di altre app sullo stesso server virtuale. La mia webapp ha alcuni controlli di inizializzazione / integrità in un metodo servletContextListener- > contextInitialized. Voglio rendere la webapp non disponibile se i controlli di inizializzazione / integrità falliscono. Qual è un modo affidabile per farlo? Sarà sufficiente lanciare una RuntimeException dall'interno del contesto Inizializzato? Si prevede che il resto dell'EAR sarà ancora disponibile? Grazie.
Soluzione
Consiglio di lanciare un RuntimeException
da ServletContextListener.contextInitialized
.
Servlet 2.3 non era molto chiaro su questo, ma Servlet 2.4 ha aggiunto il seguente dettaglio:
Alcune eccezioni non si verificano in chiama lo stack di un altro componente nel file applicazione. Un esempio di questo è un ... ServletContextListener quello genera un'eccezione non gestita durante a notifica del contesto servlet inizializzazione…. In questo caso, lo sviluppatore non ha alcuna possibilità di farlo gestire l'eccezione. Il container può rispondere a tutte le richieste successive all'applicazione Web con un HTTP codice di stato 500 per indicare un errore dell'applicazione.
Poiché dice che il motore servlet "può" disabilita l'accesso all'applicazione, potresti trovare un server che fa qualcos'altro. Tuttavia, Tomcat e WebLogic disabilitano entrambi l'applicazione e l'unica altra cosa ragionevole a cui riesco a pensare sarebbe ignorare l'eccezione. Non riesco a vedere un container che è stato molto popolare, quindi è meglio testarlo in WebSphere da soli.
Altri suggerimenti
Lanciare una RuntimeException probabilmente renderà non disponibile solo quel servlet. Un modo più sicuro potrebbe essere quello di implementare qualcosa come un intercettore Spring che inoltrerà a una pagina di errore o qualcosa del genere se i controlli non si sono verificati. In questo modo, non è necessario impedire il caricamento dell'app, ma è possibile gestirlo con maggiore grazia in fase di esecuzione.