it-swarm.com.ru

Отладчик Eclipse всегда блокирует ThreadPoolExecutor без каких-либо явных исключений, почему?

Я работаю над своими обычными проектами на 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. Это очень раздражает, потому что мне всегда приходится возобновлять работу во время отладки.

Есть какие-нибудь подсказки?

205
gotch4

Опубликованная трассировка стека указывает на то, что RuntimeException обнаружен в потоке Daemon. Это обычно не выполняется во время выполнения, если исходный разработчик не уловил и не обработал исключение.

Как правило, отладчик в Eclipse настроен на приостановку выполнения в месте, где было сгенерировано исключение, на всех необработанных исключений . Обратите внимание, что исключение может быть обработано позже, ниже в кадре стека и может не привести к завершению потока. Это будет причиной наблюдаемого поведения.

Настройка поведения Eclipse просто:
Перейти к Окно> Предпочтения> Java> Отладка и снять отметку Приостановить выполнение на невыясненных исключениях.

286
Vineet Reynolds

Существует более конкретное решение, которое предотвращает взлом Eclipse для RuntimeExceptions, генерируемых только из данного класса.

  1. Добавить новый точка останова исключения с точки зрения отладки
  2. Перейти к своему свойства
  3. Перейти к Фильтрация
  4. В разделе "Ограничить выбранные местоположения" нажмите "Добавить класс".
  5. Добавить Java.util.concurrent.ThreadPoolExecutor
  6. снимите флажок, то есть они будут игнорироваться
47
EngineerBetter_DJ

Это поведение запускается Tomcat при перезагрузке веб-приложения. Это часть Tomcat функция "защиты от утечки памяти" , которая (помимо прочего) заставляет обновлять свои потоки.

Это теперь исправлено в версиях 7.0.54 и 8.0.6 Tomcat: https://issues.Apache.org/bugzilla/show_bug.cgi?id=56492

23
slaurent

Я заметил, что это часто происходит после изменения файлов сервера (jsp или Java), и у STS возникают проблемы с перезагрузкой приложения.

Обычно это приводит к перезапуску сервера, чтобы синхронизировать изменения.

После введения JRebel - кажется, ушел. Итак, я хотел бы подумать, что это воспроизводимая проблема в STS при горячей замене кода в режиме отладки.

Удаляя нативную горячую замену, она устраняет проблему с ее разрывом внутри класса ThreadPoolExecutor.

2
DaCrazyCoder