Tomcat で S2Wicket、S2Chronos を使った時にログに clearReferencesThreads が出る
アンデプロイ時にエラーが出る。
S2Wicketの場合。
2011/12/13 16:57:37 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 致命的: The web application [/app] appears to have started a thread named [ModificationWatcher Task] but has failed to stop it. This is very likely to create a memory leak.
というエラーが出る。
ReloadingWicketFilter は、リロード時にはReloadingClassLoaderのdestroyメソッドを呼ぶが、終了時には呼ばない。本番環境で使うことが想定されていない?というかそもそもメンテされていない?
S2WicketFilterのdestroy時にReloadingClassLoaderのdestroyを呼ぶ。
ClassLoader classLoader = getClassLoader(); if (classLoader instanceof ReloadingClassLoader) ((ReloadingClassLoader) classLoader).destroy();
これで解決?
# 追記: initの最初に destroy() を呼んでいるが、ここでは ReloadingClassLoaderを破棄してはいけないのでこっちも変更する必要があった。
S2Chronosの場合。
2011/12/13 16:39:52 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 致命的: The web application [/app] appears to have started a thread named [chronos-pool-1-daemonthread-4] but has failed to stop it. This is very likely to create a memory leak.
のようなログ。
検索したら、同じ症状を発見。
http://sourceforge.jp/ticket/browse.php?group_id=4342&tid=26285 (diff)
setContextClassLoader(null) だけ変更すればいいのだろうかと思ってやってみるとタスクが動作しなかった。
1.0.1-SNAPSHOTだと色々変わってるようなので変更してみたがこれでもダメ。
あと時々タスクが実行されない。この時々がうまく再現できない。 DB連携絡みのプログラムのミスっぽい。または、CloneTaskしていないものを複数実行しようとしたとか。
NonDelayTriggerやDelayTriggerを頻繁に起動する + CronTrigger で、一年間放ったらかしていても動くのか少し不安が残る。
S2Chronosは手軽で便利なんだけど、cronでシンプルにwgetした方がトラブルになりにくいかな…。
DelayTrigger手動登録の代わりは普通にThread生成してsleepするか、GAEのようにURLを呼び出すか…。WicketのPageParametersでURL生成がリンクと同じようにできるから、URL呼び出しでもいいような気がしてきた。