Tomcat ne ferme pas ses portes dans Eclipse

Je construis une application Web relativement simple dans laquelle la servlet principale implémente l’interface ServletContextListener pour déterminer si le contexte a été démarré ou arrêté. J’ai implémenté mes contextInitialized , contextDestroyed , init et destroy (à la fois init et destroy super sur la classe de base). Actuellement, je n’ai implémenté aucune fonctionnalité réelle, à part le fait que j’ai initialisé log4j dans la méthode contextInitialized où je charge le fichier log4j.properties .

Cependant, lorsque je démarre et arrête le serveur Tomcat à partir d’Eclipse, tout est appelé dans le bon ordre (j’utilise quelques System.out.println pour le tester), mais après environ 10 secondes d’arrêt du serveur, on me présente. avec une fenêtre contextuelle Eclipse indiquant ce qui suit:

Serveur Tomcat v6.0 Le serveur localhost ne répond pas. Voulez-vous mettre fin à ce serveur? Cliquez sur OK pour mettre fin au serveur ou sur Annuler pour continuer à attendre.

Voici ce qui est imprimé dans ma console Eclipse lorsque j’arrête le serveur:

01/04/2010 19h39 stop org.apache.catalina.core.StandardService
INFO: Arrêt du service Catalina
contextDestroyed
04/01/2010 19:39:13 PM org.apache.coyote.http11.Http11Protocol détruire
INFO: Arrêt de Coyote HTTP / 1.1 sur http-8080

Et après le dernier message INFO , il se bloque jusqu’à ce que la fenêtre contextuelle apparaisse. Si je choisis d’attendre, appuyez sur Annuler, Eclipse devient inutilisable et je dois tuer le processus Eclipse à partir d’un terminal.

Toute consortingbution sur la façon de résoudre ce problème serait grandement appréciée.

METTRE À JOUR:

Le problème était dû à un thread non démon que je lance dans ma méthode init (j’ai oublié de le mentionner :). Le problème a été résolu en arrêtant explicitement le thread avec la méthode stop , même si cette méthode semble être déconseillée.

Comme mentionné dans ce fil , cela devrait être lié à un problème de nettoyage.

Si une application Web ne nettoie pas complètement, en particulier en ce qui concerne l’arrêt des threads non démon qu’elle démarre, Tomcat ne parviendra pas à s’éteindre.
Cliquer sur “Stop” a l’avantage de fournir un délai d’attente.
Si Tomcat ne parvient pas à s’arrêter dans le délai imparti, une boîte de dialog vous permettant de mettre fin au serveur ou de continuer à attendre s’affiche.

Ouvrez l’invite de commande ou PowerShell dans Windows et tapez

 netstat -nao 

trouve le pid du port correspondant dans le résultat et le type

 taskkill /f /pid [port number] 

Exemples:

 taskkill /pid 1230 /pid 1241 /pid 1253 taskkill /f /fi "USERNAME eq NT AUTHORITY\SYSTEM" /im notepad.exe taskkill /s srvmain /f /im notepad.exe taskkill /s srvmain /u maindom\hiropln /pp@ssW23 /fi "IMAGENAME eq note*" /im * taskkill /s srvmain /u maindom\hiropln /fi "USERNAME ne NT*" /im * taskkill /f /fi "PID ge 1000" /im * 

Veuillez utiliser ce lien https://technet.microsoft.com/en-us/library/bb491009.aspx

Sous Windows, ouvrez le Gestionnaire des tâches et tuez le processus javaw .

J’ai eu un comportement similaire. Si fermer Tomcat n’aide pas, essayez de trouver une autre console active à partir de la vue console et de la tuer. Dans mon cas, ça aide.

Sous Mac OS X, utilisez Activity Monitor, forcez le processus GrailsStarter à quitter.

Je regardais votre mise à jour qui a également résolu votre problème. Pour tous les autres téléspectateurs de cette question, je souhaite offrir une meilleure approche.

Au lieu d’utiliser stop, vous devez appeler interruption sur le thread et encapsuler le code de la méthode run dans la boucle qui vérifie! IsInterrupted (), à chaque fois que interruption est appelée, le thread sort de la boucle et la méthode run termine son traitement. Comme l’exemple ci-dessous tiré d’une autre réponse

 class Consumer implements Runnable{ private BlockingQueue blockingQueue; Consumer(BlockingQueue blockingQueue){ this.blockingQueue=blockingQueue; } @Override public void run(){ while(!Thread.interrupted()){ System.out.print("Concumer Started"); try{ Message message = blockingQueue.take(); System.out.print("message Id"+message.messageId+" Consumed "); } catch(InterruptedException e){ e.printStackTrace(); } System.out.println("Concumer Done"); } } }