すみません愛読書です。
B.L.T.と一緒にsabraをゲット。
表紙がゴーオンシルバーの子だったのでつい・・・的な。
あと本日の苦行。
「Tomcat + Struts 2でTomcat終了時にLogFactory.getCachedFactoryでNullPointerExceptionが発生する」
なぜこんなことが起きてしまうのか。ざっくり言うと、
- TomcatのWebappClassLoaderは、終了時に自分がロードした全クラスのstaticフィールドを強制的にnullにする
- Struts 2が使用しているLogFactoryクラスは、クラスロード時にstatic factoriesフィールドにオブジェクトを設定し、メソッドはすべてfactoriesフィールド != nullであることを前提に実装している
- Struts 2のDispatcherはstaticフィールド初期化時にLogFactory.getLogを呼び出すが、これがWebappClassLoaderの終了時に呼び出されてしまう(リフレクションの複雑な挙動に足を突っ込んでしまうので詳細は割愛。)
で、結果的にLogFactoryクラスが想定していない状態でメソッドが呼び出されてしまい、
ぬるぽになると・・・TomcatやStruts2やCommons Loggingのソース読んだりして3時間近く
使ってしまった。
ググってもあんまり情報が出てこなかったなぁ・・・終了時の例外なんてみんな気にしないのだろうか^^;
ちなみに、システムプロパティを変更することでWebappClassLoaderのフィールドリセット処理を
抑制できる。これでぬるぽは起きなくなる。(詳細はWebappClassLoaderのソースコードを
見ればわかる。)
眠い。寝よう。
コメントする