2009-10-08 13 views
4

J'ai une servlet init dans Tomcat qui charge des données critiques. Parfois, il est nécessaire d'annuler le démarrage sur certaines erreurs.shutdown/undeploy tomcat from Servlet

comment puis-je arrêter l'application grâce déployé/l'ensemble du serveur d'applications sans appeler System.exit(1)

je veux éviter d'appeler le servlet d'arrêt via le port, car ce n'est pas configuré dans mon installation.

il peut y avoir des tâches qui doivent être exécutés des auditeurs sur l'arrêt définis dans web.xml

Répondre

7

Tout d'abord, vous ne devriez jamais jamais jamais appeler System.exit() à partir d'un conteneur de servlets, comme il pourrait y avoir d'autres applications courir dans le même processus que le vôtre, et il serait incroyablement incorrect de tuer de force l'ensemble du processus. En supposant que votre "servlet init" implémente ServletContextListener, il n'y a aucun moyen formel défini dans l'interface API/interface pour signaler au conteneur de servlet "s'il vous plaît arrêter l'application soigneusement". Vous pouvez cependant lancer une sorte de RuntimeException de la méthode contextInitialized(), qui dans la plupart des conteneurs (au moins Tomcat) arrêtera le démarrage de votre webapp et le laissera dans l'état "arrêté". Cependant, je doute que Tomcat continuera à appeler vos auditeurs d'arrêt. Vous voudrez peut-être repenser votre conception afin que vos données critiques/la logique d'arrêt ne soient pas aussi étroitement liées au cycle de vie du conteneur de servlet.

+0

son plus sur la fermeture des threads utilitaires et l'écriture correcte des journaux –

+1

J'avais l'habitude de partager un Tomcat avec une mauvaise application qui manque de mémoire tout le temps. Quand je détecte cela, j'appelle System.exit (0). La fermeture est aussi gracieuse qu'une autre approche dans Tomcat. –

+1

Eh bien, si vous obtenez des MOO, alors il n'y a plus rien à faire, mais arrêter la JVM. –