[Wicket-ja-user 116] Re: WebApplicationのThreadLocalについて

Back to archive index

Tsutomu Yano benbr****@mac*****
2008年 6月 22日 (日) 10:24:25 JST


矢野です。

正直言って明確な回答はもってませんが、ソースを追ってみてのなんとなくこうだろうな、というのを
書きます。別にコミッタに聞いたわけでもないですから、単なる想像です。

まず質問の意味を「WebApplicationのインスタンスをThreadLocalに入れている意図はなんなのか?」に
しぼりますね。後半は「なぜThreadLocalに入れるのがWebApplicationなのか?」になっているように
読めまして、両者は異なる質問に思えますので。

「どうしてThreadLocalに入れる必要があるのか?」のほうだけにしぼります。


私が思うに、WicketFilterクラスは一つのweb.xmlに複数書けるけど、WicketFilterクラスは一つしか
ロードされないからじゃないでしょうか。一つのwar内のクラスは一つのアプリケーション・クラスローダ
でロードされますから、WicketFilterを使う<filter>タグが複数あってもロードされるクラスは一つだけですよね。

それぞれの<filter>タグに別のWebApplicationクラスが指定されていたとしても、WicketFilterは一つのクラス
だけでそれらを切り替えて処理できなければいけません。リクエストごとにどっちの<filter>タグで処理される
のかは不明ですから、リクエストが来るたびにWicketFilterはWebApplicationを切り替えてやらないといけない
ことになります。WebApplicationをstatic変数に保存することはできません。

# 言うまでもありませんが、インスタンス変数はもちろんだめです。

リクエストごとなのだからHttpServletRequestを使う手もありますが、それではHttpServletRequestにアクセス
できるところでないとWebApplicationにアクセスできません。

リクエストからレスポンスまでのサイクルは必ず一つのスレッドで処理されますので、ThreadLocalであれば、
リクエスト中どこからでもアクセスできる箱として使えます。

WicketFilterはリクエストの入り口ですから、ここでApplication.set()を使って適切なWebApplicationインスタンスを
ThreadLocalに格納し、以降の処理では必ずApplication.get()を使ってWebApplicationクラスにアクセスするように
すれば、常に適切なWebApplicationにアクセスできます。

というような理由ではないかと思うのですが、どうでしょうか。


On 2008/06/19, at 9:14, Takashi NAKAJIMA wrote:

> はじめまして。
> 中島といいます。
>
> Wicketの使い方というより内部的な挙動についてなのですが、
> WicketFilter内でWebApplicationのインスタンスをThreadLocalに入れている意図って何なのでしょうか?
>
> 何らかのThreadLocalな変数がApplicationから取得できる方が都合がいいとかなら、コンテキストクラスのようなものでも
> 良いと思うのですが、なぜWebApplicationなのだろうか?と思っています。
>
> 何か根本的に読み違えているかもしれませんが、ご教示ください。
>
> 以上、よろしくお願いいたします。
>
> # まだwicketを使い始めて数ヶ月しか経っていないのですが、非常に興味を惹かれるアーキテクチャですね。
> # 矢野さんのWicket本楽しみにしています。
>
> _______________________________________________
> Wicket-ja-user mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user

---------------------------------------------------
矢野 勉(やの つとむ)
電子メール:benbrand_at_mac.com
---------------------------------------------------




Wicket-ja-user メーリングリストの案内
Back to archive index