sabra

| コメント(0) | トラックバック(0)
すみません愛読書です。
B.L.T.と一緒にsabraをゲット。

RIMG0020.JPG

表紙がゴーオンシルバーの子だったのでつい・・・的な。


あと本日の苦行。
「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のソースコードを
見ればわかる。)

眠い。寝よう。

トラックバック(0)

トラックバックURL: http://yzwlab.net/mt/mt-tb.cgi/402

コメントする

このブログ記事について

このページは、yacchinが2009年3月27日 01:50に書いたブログ記事です。

ひとつ前のブログ記事は「例外」です。

次のブログ記事は「値段設定」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.14-en