Ich arbeite an meinen üblichen Projekten in Eclipse, einer J2EE-Anwendung, die mit Spring, Hibernate usw. erstellt wurde. Ich verwende dafür Tomcat 7 (kein besonderer Grund, ich nutze keine neue Funktion, ich wollte das nur ausprobieren). Jedes Mal, wenn ich meine Anwendung debugge, wird der Eclipse-Debugger angezeigt, als hätte er einen Haltepunkt erreicht. Dies ist jedoch nicht der Fall. Tatsächlich wird er in einer Java-Quelldatei gestoppt ThreadPoolExecutor
. Es gibt keine Stapelverfolgung auf der Konsole, sie stoppt nur. Wenn ich dann auf Fortsetzen klicke, geht es weiter und die App funktioniert perfekt. Folgendes wird im Debugger-Fenster angezeigt:
Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException))
ThreadPoolExecutor$Worker.run() line: 912
TaskThread(Thread).run() line: 619
Ich kann das wirklich nicht erklären, weil ich es überhaupt nicht benutze ThreadPoolExecutor
. Muss etwas von Tomcat, Hibernate oder Spring sein. Es ist sehr ärgerlich, weil ich beim Debuggen immer weitermachen muss.
Irgendwelche Hinweise?
Antworten:
Der gepostete Stack-Trace zeigt an, dass in einem Daemon-Thread eine RuntimeException aufgetreten ist. Dies wird normalerweise zur Laufzeit nicht erfasst, es sei denn, der ursprüngliche Entwickler hat die Ausnahme abgefangen und behandelt.
In der Regel ist der Debugger in Eclipse so konfiguriert, dass die Ausführung an dem Ort, an dem die Ausnahme ausgelöst wurde, für alle nicht erfassten Ausnahmen angehalten wird . Beachten Sie, dass die Ausnahme möglicherweise später im Stapelrahmen behandelt wird und möglicherweise nicht dazu führt, dass der Thread beendet wird. Dies wäre die Ursache für das beobachtete Verhalten.
Konfigurieren Sie das Verhalten von Eclipse ist einfach:
Gehen Sie zu Fenster > Einstellungen > Java > Debug und deaktivieren Suspend Ausführung auf nicht abgefangene Ausnahmen .
quelle
Es gibt eine spezifischere Lösung, die verhindert, dass Eclipse auf
RuntimeException
s bricht , die nur von einer bestimmten Klasse geworfen werden.java.util.concurrent.ThreadPoolExecutor
quelle
RuntimeException
? Muss es aktiviert oder deaktiviert sein? Sollten "Gefangene Orte" und "Nicht gefangene Orte" ein- oder ausgeschaltet sein?Dieses Verhalten wird von Tomcat ausgelöst, wenn eine Webanwendung neu geladen wird. Es ist Teil der Tomcat-Funktion "Memory Leak Protection" , die (unter anderem) die Erneuerung ihrer Threads erzwingt.
Dies wurde jetzt in den Versionen 7.0.54 und 8.0.6 von Tomcat behoben: https://issues.apache.org/bugzilla/show_bug.cgi?id=56492
quelle
Ich habe festgestellt, dass dies häufig nach dem Ändern von Serverdateien (jsp oder java) auftritt und STS Probleme beim erneuten Laden der Anwendung hat.
Dies führt normalerweise zu einem Neustart des Servers, damit die Änderungen synchronisiert werden.
Nach der Einführung von JRebel scheint es verschwunden zu sein. Daher würde ich gerne glauben, dass es sich bei STS um ein reproduzierbares Problem handelt, wenn Hotswapping-Code im Debug-Modus ausgeführt wird.
Durch das Entfernen des nativen Hotswapping wird das Problem behoben, dass es innerhalb der ThreadPoolExecutor-Klasse beschädigt wird.
quelle