Я работаю над своими обычными проектами на Eclipse, это приложение J2EE, созданное с помощью Spring, Hibernate и так далее. Я использую Tomcat 7 для этого (без особой причины, я не использую никаких новых функций, я просто хотел попробовать это). Каждый раз, когда я отлаживаю свое приложение, случается, что отладчик Eclipse выскакивает, как будто он достиг точки останова, но это не так, фактически он останавливается на исходном файле Java ThreadPoolExecutor
. На консоли нет трассировки стека, она просто останавливается. Затем, если я нажимаю на резюме, оно продолжается, и приложение работает отлично. Вот что показано в окне отладчика:
Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException))
ThreadPoolExecutor$Worker.run() line: 912
TaskThread(Thread).run() line: 619
Я действительно не могу объяснить это, потому что я не использую ThreadPoolExecutor
вообще. Должно быть что-то из Tomcat, Hibernate или Spring. Это очень раздражает, потому что мне всегда приходится возобновлять работу во время отладки.
Есть какие-нибудь подсказки?
Ответы:
Опубликованная трассировка стека указывает на то, что RuntimeException обнаружен в потоке Daemon. Обычно это не выполняется во время выполнения, если только первоначальный разработчик не уловил и не обработал исключение.
Как правило, отладчик в Eclipse настроен на приостановку выполнения в месте, где было сгенерировано исключение , для всех неперехваченных исключений . Обратите внимание, что исключение может быть обработано позже, ниже в кадре стека и может не привести к завершению потока. Это будет причиной наблюдаемого поведения.
Настройка поведения Eclipse просто:
Перейти к Window > Preferences > Java > Debug и снимите флажок Приостановить выполнение на неперехваченных исключениях .
источник
Существует более конкретное решение, которое предотвращает взлом Eclipse
RuntimeException
только для заданного класса.java.util.concurrent.ThreadPoolExecutor
источник
RuntimeException
? Должен ли он быть включен или отключен? Должны ли «Пойманные места» и «Пойманные места» быть включены или выключены?Это поведение запускается tomcat при перезагрузке веб-приложения. Это часть функции tomcat «защита от утечки памяти», которая (помимо прочего) заставляет обновлять свои потоки.
Теперь это исправлено в версиях 7.0.54 и 8.0.6 tomcat: https://issues.apache.org/bugzilla/show_bug.cgi?id=56492
источник
Я заметил, что это часто происходит после изменения файлов сервера (jsp или java), и у STS возникают проблемы с перезагрузкой приложения.
Обычно это приводит к перезапуску сервера, чтобы синхронизировать изменения.
После введения JRebel - кажется, ушел. Итак, я хотел бы думать, что это является воспроизводимой проблемой в STS при горячей замене кода в режиме отладки.
Удаляя нативную горячую замену, она устраняет проблему с ее разрывом внутри класса ThreadPoolExecutor.
источник