私はxmlで定義されたinitメソッドを持つクラスを持っています
<bean id="appStarter" class="com.myapp.myClass" init-method="init" destroy-method="destroy"/>
私のクラス:
public class myClass{
private Thread t;
public void init() {
t = new Thread() {
@Override
public void run() {
while (true)
try {
doStuff();
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
};
t.start();
}
public void destroy() {
t.interrupt();
}
}
アプリが起動すると、これらのスレッドは正常に実行され、すべてが正常に動作し、しばらくすると次の例外が発生します。
INFO: Illegal access: this web application instance has been stopped already. Could not load com.Sun.mail.imap.IMAPStore. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
Java.lang.IllegalStateException
at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1273)
at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1233)
at javax.mail.Session.getService(Session.Java:755)
at javax.mail.Session.getStore(Session.Java:569)
at javax.mail.Session.getStore(Session.Java:531)
at javax.mail.Session.getStore(Session.Java:510)
doStuffメソッド内:
public void doStuff(){
Session sessioned = Session.getDefaultInstance(System.getProperties(),
null);
Store store = sessioned.getStore("imap");
store.connect(hostName, userName, password);
.
.
.
}
理由はわかりませんが、アイデアはありますか?
TomcatとApacheを再起動すると問題が解決し、Tomcatは古いバージョンのアプリをキャッシュしていました。
要するに、これは、Webアプリケーションをホットデプロイしているときに発生する可能性があります。たとえば、ide + developmentサーバーは再び戦争をホットデプロイします。以前に作成されたスレッドはまだ実行中です。ただし、その間、クラスローダー/コンテキストは無効であり、元のwebapp(以前のランタイム環境)が再デプロイされているため、IllegalAccessException/IllegalStateExceptionに直面します。
そのため、ここで述べているように、再起動してもこの問題が永続的に解決されるわけではありません。代わりに、マネージスレッドプールs.thを見つけて実装することをお勧めします。このように、スレッドの終了を適切に処理します。 JavaEEでは、これらのManagedThreadExeuctorServicesを使用します。 同様の意見と参考文献 。
この例は、プールの構成(最大アイドルなど)に従ってプールされたインスタンスを「クリーンアップ」するApache Commons PoolのEvictorThreadです。
これは、アプリをアンデプロイしようとした後に発生すると思われます。 そのスレッドを殺すinit()
プロセス中に初期化したことはありますか?これは、対応するdestroy()
メソッドで行います。
Apache Tomcatの停止中にこの問題が発生し、Apache上のすべてのプロジェクトを削除して編集しました。
サーバーを再起動すると、この問題を解決できます。
Dynamic Jasper Reportingを使用しているときに同じエラーが発生していました。アプリケーションを初めて使用してレポートを作成するためにアプリケーションをデプロイすると、レポート作成は正常に機能しますが、サーバーへのコード変更のホットデプロイメントを行うと、このエラーが発生していました。