2 つの SingleThreadExecutor スレッドと 1 つの FixedThreadPool を使用する Google Web Toolkit アプリケーションで問題が発生しています。catalina.out ログから、スレッドが適切にシャットダウンされていないことがわかります。これにより、tomcat プロセスが実行され続けます。
INFO: Stopping service Catalina
Oct 30, 2012 2:16:48 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/btq] appears to have started a thread named [pool-4-thread-1] but has failed to stop it. This is very likely to create a memory leak.
Oct 30, 2012 2:16:48 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/btq] appears to have started a thread named [pool-5-thread-1] but has failed to stop it. This is very likely to create a memory leak.
Oct 30, 2012 2:16:48 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/btq] appears to have started a thread named [Thread-4] but has failed to stop it. This is very likely to create a memory leak.
この種のことを処理するために ServletContextListener を使用することへの参照を見つけましたが、私の状況でそれを機能させるのに問題があります。
ある試みでは、GWT コードのサーバー側実装である GUIImpl クラスに ServletContextListener を追加しました。
public class GUIImpl extends RemoteServiceServlet implements GUI, ServletContextListener
これはおそらく通常の方法ではないと思いますが、ExecutorService をインスタンス化するクラスが他のプロジェクトとの共有コードを含む別のパッケージにあるため、この方法で実行しようとしました。私の実装では、他のクラスでいくつかのシャットダウン関数を呼び出すだけですが、いくつかの例外が発生しています。
@Override
public void contextDestroyed(ServletContextEvent event) {
this.context = event.getServletContext();
context.log( "FUNCTION: GUIImpl.contextDestroyed - called" );
// Tell the Presenter to shut down
presenter.shutdown();
}
Presenter クラスには、Executor をインスタンス化する FileSystemMonitor クラスのインスタンスがあります。ログの例外は次のとおりです。
Oct 30, 2012 2:16:48 PM org.apache.catalina.core.ApplicationContext log
INFO: FUNCTION: GUIImpl.contextDestroyed - called
Oct 30, 2012 2:16:48 PM org.apache.catalina.core.StandardContext listenerStop
SEVERE: Exception sending context destroyed event to listener instance of class com.mdaus.btq.gui.server.GUIImpl
java.lang.NullPointerException
at com.mdaus.btq.gui.server.GUIImpl.contextDestroyed(GUIImpl.java:1236)
at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4831)
at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5478)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
at org.apache.catalina.core.ContainerBase$StopChild.call(ContainerBase.java:1575)
at org.apache.catalina.core.ContainerBase$StopChild.call(ContainerBase.java:1564)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Oct 30, 2012 2:16:48 PM org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextDestroyed()
Oct 30, 2012 2:16:48 PM org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextDestroyed()
質問が少し長くてわかりにくい場合は申し訳ありませんが、元のコードを書いていないので、今は少し混乱しています。
これらのスレッドをシャットダウンする方法についてのアイデアはありますか?