Le débogueur Eclipse bloque toujours ThreadPoolExecutor sans exception évidente, pourquoi?

Je travaille sur mes projets habituels sur Eclipse, c’est une application J2EE, réalisée avec Spring, Hibernate, etc. J’utilise Tomcat 7 pour cela (pas de raison particulière, je n’exploite aucune nouvelle fonctionnalité, je voulais juste essayer ça). Chaque fois que je débogue mon application, il arrive que le débogueur d’Eclipse sorte comme s’il avait atteint un point d’arrêt, mais ce n’est pas le cas, en fait, il s’arrête sur un fichier source Java, ThreadPoolExecutor . Il n’y a pas de trace de stack sur la console, elle s’arrête juste. Ensuite, si je clique sur reprendre, ça continue et l’application fonctionne parfaitement. C’est ce que montre la fenêtre du débogueur:

 Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException)) ThreadPoolExecutor$Worker.run() line: 912 TaskThread(Thread).run() line: 619 

Je ne peux vraiment pas l’expliquer, car je n’utilise pas du tout ThreadPoolExecutor . Doit être quelque chose de Tomcat, Hibernate ou Spring. C’est très ennuyeux car je dois toujours reprendre pendant le débogage.

Des indices?

La trace de la stack publiée indique qu’une exception RuntimeException a été détectée dans un thread Daemon. Ceci est généralement inattendu à l’exécution, sauf si le développeur d’origine a détecté et géré l’exception.

En règle générale, le débogueur dans Eclipse est configuré pour suspendre l’exécution à l’emplacement où l’exception a été générée, sur toutes les exceptions non interceptées . Notez que l’exception peut être gérée plus tard, plus bas dans le cadre de la stack et peut ne pas entraîner la fin du thread. Ce serait la cause du comportement observé.

La configuration du comportement d’Eclipse est simple:
Allez dans Fenêtre > Préférences > Java > Déboguer et désélectionnez Suspendre l’exécution sur des exceptions non interceptées .

Il existe une solution plus spécifique, qui empêche la rupture d’Eclipse sur RuntimeException levée uniquement à partir d’une classe donnée.

  1. Ajouter un nouveau point d’ arrêt d’exception dans la perspective de débogage
  2. Aller à ses propriétés
  3. Aller au filtrage
  4. Dans “Restreindre l’emplacement (s) sélectionné (s)”, cliquez sur ” Ajouter un cours
  5. Ajouter java.util.concurrent.ThreadPoolExecutor
  6. Décochez la case , ce qui signifie qu’ils seront ignorés

Ce comportement est déclenché par tomcat lorsqu’une application Web est rechargée. Cela fait partie de la fonctionnalité “protection contre les memory leaks” de tomcat qui, entre autres choses, force le renouvellement de ses threads.

Ceci est maintenant corrigé à partir des versions 7.0.54 et 8.0.6 de tomcat: https://issues.apache.org/bugzilla/show_bug.cgi?id=56492

J’ai remarqué que cela se produit souvent après la modification des fichiers du serveur (jsp ou java) et que STS a du mal à recharger l’application.

Cela entraîne généralement le redémarrage du serveur pour que les modifications soient synchronisées.

Après l’introduction de JRebel, il semble avoir disparu. Donc, je voudrais penser que c’est un problème reproductible dans STS lorsque le code de changement à chaud en mode débogage.

En supprimant le Hotswapping natif, il élimine le problème de rupture de la classe ThreadPoolExecutor.