Pracuję nad moimi zwykłymi projektami w Eclipse, jest to aplikacja J2EE, wykonana w Spring, Hibernacja i tak dalej. Używam do tego Tomcat 7 (bez konkretnego powodu, nie wykorzystuję żadnej nowej funkcji, chciałem tylko spróbować). Za każdym razem, gdy debuguję moją aplikację, zdarza się, że debuger Eclipse wyskakuje, jakby osiągnął punkt przerwania, ale tak nie jest, w rzeczywistości zatrzymuje się na źródłowym pliku Java ThreadPoolExecutor
. Na konsoli nie ma śladu stosu, po prostu się zatrzymuje. Następnie, jeśli kliknę przycisk Wznów, będzie on kontynuowany, a aplikacja będzie działać idealnie. Oto, co pokazuje okno debugera:
Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException))
ThreadPoolExecutor$Worker.run() line: 912
TaskThread(Thread).run() line: 619
Naprawdę nie potrafię tego wyjaśnić, ponieważ w ogóle nie używam ThreadPoolExecutor
. Musi to być coś z Tomcat, Hibernacji lub Wiosny. To bardzo denerwujące, ponieważ zawsze muszę wznawiać pracę podczas debugowania.
Jakieś wskazówki?
Odpowiedzi:
Wysłany ślad stosu wskazuje, że w wątku Daemon napotkano wyjątek RuntimeException. Zwykle nie jest to rejestrowane w środowisku wykonawczym, chyba że pierwotny programista wychwycił wyjątek i zajął się nim.
Zwykle debuger w środowisku Eclipse jest skonfigurowany do zawieszania wykonywania w miejscu, w którym został zgłoszony wyjątek , dla wszystkich nieprzechwyconych wyjątków . Zauważ, że wyjątek może być obsłużony później, niżej w ramce stosu i może nie doprowadzić do zakończenia wątku. Byłoby to przyczyną obserwowanego zachowania.
Konfiguracja zachowania Eclipse jest prosta:
Przejdź do Window > Preferencje > Java > Debuguj i usuń zaznaczenie Wstrzymaj wykonywanie w przypadku nieprzechwyconych wyjątków .
źródło
Istnieje bardziej specyficzne rozwiązanie, które zapobiega zrywaniu się Eclipse na
RuntimeException
s rzucanym tylko z danej klasy.java.util.concurrent.ThreadPoolExecutor
źródło
RuntimeException
? Czy to musi być włączone lub wyłączone? Czy „Złapane lokalizacje” i „Nie złapane lokalizacje” powinny być włączone, czy wyłączone?To zachowanie jest wyzwalane przez tomcat podczas ponownego ładowania aplikacji internetowej. Jest to część funkcji tomcat „ochrona przed wyciekiem pamięci”, która (między innymi) wymusza odnowienie swoich wątków.
Zostało to naprawione w wersjach 7.0.54 i 8.0.6 tomcat: https://issues.apache.org/bugzilla/show_bug.cgi?id=56492
źródło
Zauważyłem, że często występuje to po modyfikacji plików serwera (jsp lub java) i STS ma problem z ponownym załadowaniem aplikacji.
Zwykle prowadzi to do ponownego uruchomienia serwera w celu zsynchronizowania zmian.
Po wprowadzeniu JRebel - wygląda na to, że zniknął. Chciałbym więc pomyśleć, że jest to powtarzalny problem w STS, kiedy kod wymiany w trybie debugowania jest gorący.
Usuwając natywną funkcję wymiany hots, eliminuje problem z awarią wewnątrz klasy ThreadPoolExecutor.
źródło