私はEclipseでの通常のプロジェクトに取り組んでいます。これは、Spring、Hibernateなどで作成されたJ2EEアプリケーションです。私はこのために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が発生したことを示しています。元の開発者が例外をキャッチして処理しない限り、これは通常、実行時にキャッチされません。
通常、Eclipseのデバッガーは、例外がスローされた場所で実行を一時停止するように構成されていますすべてのキャッチされていない例外。例外は後で処理される可能性があり、スタックフレームの下位になり、スレッドが終了しない可能性があることに注意してください。これは、観察される動作の原因です。
Eclipseの動作の設定は簡単です:
Go to Window> Preferences> Java> Debug and uncheck Suspend executionキャッチされない例外。
特定のクラスからのみスローされるRuntimeException
sでEclipseが壊れるのを防ぐ、より具体的なソリューションがあります。
Java.util.concurrent.ThreadPoolExecutor
を追加この動作は、webappがリロードされるときにTomcatによってトリガーされます。これはTomcatの一部です 「メモリリーク保護」機能 (特に)スレッドの更新を強制します。
これは、Tomcatのバージョン7.0.54および8.0.6から修正されました。 https://issues.Apache.org/bugzilla/show_bug.cgi?id=56492
サーバーファイル(jspまたはJava)を変更した後にこれが頻繁に発生し、STSがアプリケーションの再ロードに問題があることに気付きました。
通常、これにより、サーバーを再起動して変更を同期させることができます。
JRebelを紹介した後、それはなくなったようです。したがって、デバッグモードでコードをホットスワップすると、STSで再現可能な問題であると考えたいと思います。
ネイティブのホットスワップを削除することにより、ThreadPoolExecutorクラス内でのホットスワップの問題を解消します。