Я работаю над своими обычными проектами на 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. Это очень раздражает, потому что мне всегда нужно возобновлять работу во время отладки.
Любые подсказки?
Отслеживаемая трассировка стека указывает на то, что в потоке Daemon встречается исключение RuntimeException. Обычно это не сработано во время выполнения, если только оригинальный разработчик не поймал и не обработал исключение.
Как правило, отладчик в Eclipse настроен на приостановку выполнения в месте, где было выбрано исключение, во всех неперехваченных исключениях. Обратите внимание, что исключение может быть обработано позже, ниже в кадре стека и может не привести к завершению потока. Это было бы причиной наблюдаемого поведения.
Конфигурирование поведения Eclipse прост:
Перейдите в Окно > Настройки > Java > Отладка и снимите флажок Приостановить выполнение при неперехваченных исключениях.
Здесь есть более конкретное решение, которое предотвращает разбиение Eclipse на RuntimeException
только на заданный класс.
java.util.concurrent.ThreadPoolExecutor
RuntimeException
? Должен ли он быть включен или отключен? Должны ли «Пойманные места» и «Пойманные места» быть включены или выключены?
Это поведение запускается tomcat при перезагрузке webapp. Это часть функции tomcat защиты от утечки памяти, которая (помимо прочего) заставляет возобновить его потоки.
Теперь это исправлено из версий 7.0.54 и 8.0.6 из tomcat: https://issues.apache.org/bugzilla/show_bug.cgi?id=56492
Я заметил, что это часто происходит после изменения файлов сервера (jsp или java), и STS имеет проблемы с перезагрузкой приложения.
Это обычно приводит к перезапуску сервера, чтобы заставить синхронизировать изменения.
После введения JRebel - похоже, он ушел. Итак, я хотел бы думать, что это воспроизводимая проблема в STS, когда в режиме отладки выполняется "горячий" код.
Удалив исходную горячую настройку, она устраняет проблему с ее разбиением внутри класса ThreadPoolExecutor.