Seasarメモ

S2Container#register(ComponentDef)すると、getAssignableClassesで親まで得て、登録するんだね。PortletRequestとActionRequestとかフィルタで登録するものを作ったら、TooManyRegistrationComponentDefによってPortletRequestが重複して登録された。なるほど。

remove みたいなことをするのが見つからんから、フィルタでAction~やRender~を登録するのはやめた方が良さそうだな・・・。

Seasar

Seasarを探検中。SingletonS2ContainerFactoryは名前の通りVMで1個のS2Containerを作るのね(マルチスレッドのときは大丈夫かな)。そんでもって、S2ContainerにServletContextもinitで渡しているのか。そう考えると、Portletの場合は、PortletContextを渡せた方がよいのだろうか。そこで、S2ContainerImplを見てみると、その中では、ServletContextを利用していることはないみたい。でも、他からは呼ぶようなコンポーネントがあるのかもしれないけど。S2ContainerImplでは、RequestとResponseもThreadLocalに入れることができるみたいだな。これまた、PortletRequestとPortletResponseも渡せた方が良いのかもしれないが、ServletContext同様に、誰が利用しているのかがよくわからんな。次に、S2Container#getComponent(Object)で何が起きるのかを理解するために、S2ContainerImpl#getComponent(Object)をみてみる。assertParameterIsNotNullをした後にS2ContainerBehavior.acquireFromGetComponentを呼んでComponentDefを取得しているな。そんで、ComponentDef#getComponent()をするのか。っで、S2ContainerBehaviorってなんだろう。見ると、S2ContainerImpl#internalGetComponentDef(Object)を呼ぶみたいだな。自分が持たなければ、子のS2Containerに行くのか。基本的には、コンポーネントはComponentDefにラップされるのね。登録については、registerMapでcomponentDefMapにいれているっぽいな。つまり、S2Containerで一度、インスタンス化して、そこに入れておいて引っ張ってくるのね。request, response, session, servletContext またはクラスをgetComponentすれば、setしておけば、S2Containerからとれるのね。それを考えると、portletRequest, portletRender, portletSession, portletContext(or portletConfig)とかも、S2Container が持った方が良い気がするな。ざっと、コンポーネント周りを見て、何となく、わかったような気になった(?)ので、どう使えばいいのか、考えてみよう。そういえば、ソースコードをみていて思ったのだが、JavaDocなどのコメントがほとんどないように見える。ApacheのJava系のコードをよく読むが、ちょっとしたコメントに助けられることもよくあると思う。でも、Seasarのコードでは、コメントが見あたらないので、私みたいなこの分野の新参者にはノーヒントで理解するのはちょっと辛いな・・・。じっくり読まんと理解できんし。みんなはどうしてるんだろ・・・。

ログ解析ポートレット

待ち状態について、意味わからんと、思い、いろいろと調べたところ、どうも、今まで、Hibernateのバッチ処理ということでセッションをflushとclearをしているところを、そのまま、S2Hibernateに移行後も、残して、getComponentでセッション呼んで、flush&clearしていたのが、物理的コネクションを開きっぱなしにしてしまい、待ちになっていたみたい。でも、flushはともかく、clearしないと、セッションにたまっていかないのだろうか?明示的に対象セッションのclearを呼んだ方が良いような気もするけどどうなんだろう・・・。S2Containerからセッションとっても、新しいセッションが開くだけのような気もするし。ふむ、まだ不明な点が多し。というわけで、s2hibernate.dao関連のソースコードを探検中。