T2Framework 0.4ついに登場…しかし?

0.4からやっと本格的なフレームワークになるだろうと思い0.3のときは動作確認だけで放置してた^^;

ぱっと見た感じ「geronimo-servlet_2.5_spec-1.1」を添付する意味が謎。Tomcat6、Glassfish V2/V3PreludeともにJavaEE5のサーブレットAPIはもってるから。実際削除してみたけど、うまくいくようだ。


また、JavaEE5ではJSTLが標準APIとなっているのでGlassfish V2/V3preludeなどいわゆるアプリケーションサーバーならばこれらのファイルも削除可能だ。デプロイサイズを小さくすることが出来る。

Tomcatのような単なるサーブレットエンジンだけではどうしようもありませんけど。


だが話はそう単純ではなかった。

Glassfish V3preludeで動作確認

んで、軽くて便利なGlassfish V3Preludeでまず実行。んー。なんかおかしい。デプロイ時間が異常にかかる。

ログは以下のとおり。

情報: |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
情報:
情報: |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
情報:
情報: |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Popping appender named [STDOUT] from the object stack
情報:
情報: |-INFO in ch.qos.logback.classic.joran.action.LevelAction - org.t2framework level set to DEBUG
情報:
情報: |-INFO in ch.qos.logback.classic.joran.action.LevelAction - commons level set to DEBUG
情報:
情報: |-INFO in ch.qos.logback.classic.joran.action.LevelAction - lucy level set to DEBUG
情報:
情報: |-INFO in ch.qos.logback.classic.joran.action.LevelAction - examples level set to DEBUG
情報:
情報: |-INFO in ch.qos.logback.classic.joran.action.LevelAction - root level set to INFO
情報:
情報: |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[root]
情報:
情報: |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
情報: Loading application T2_Application_Example at /t2_04sample_nb
情報: Deployment of T2_Application_Example done is 14766 ms

「- End of configuration.」というところまではすぐに表示されるのだが、この先が5〜10秒以上時間がかかりデプロイ時間がとんでもないことになった。長いときはタイムアウトなのかたまにブラウザの起動のほうが早すぎて404になっていたりすることも。なんか変なファイルをつかんでたりするのかな?

起動してしまえば問題なく動くことは動くのだが、T2がこの遅い部分で何をしているのか気になる。

Glassfish V2で動作確認

こちらはデプロイ時間が異常に時間がかかるといったことはないようだ。1秒もかからない。というか、ログに出てるメッセージがぜんぜん違う。

deployed with moduleid = t2_04sample_nb
12:40:26,546
12:40:26,546
12:40:26,578
12:40:26,578
12:40:26,578
12:40:26,578
12:40:26,578
12:40:26,578
12:40:26,578
12:40:26,578
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を開始しました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - 対象パッケージ(examples.page)、対象URL(file:/C:/_product/_test/t2_04sample_nb/build/web/WEB-INF/classes/examples/page/)に対してクラスの登録処理を試みます.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:AddPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.AddPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:CheckboxPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.CheckboxPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:DownloadPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.DownloadPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:ForeachPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.ForeachPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:GetAndPostPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.GetAndPostPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:HelloPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.HelloPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page/hoge、クラス名:HogePage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.hoge.HogePage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:JsonPage$Hoge).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:JsonPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.JsonPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:MovePage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.MovePage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:NestForeachPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.NestForeachPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:OuterPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.OuterPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:PassThroughPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.PassThroughPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:RequestParamPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.RequestParamPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:SelectPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.SelectPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:SessionAttrPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.SessionAttrPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:TwitterPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.TwitterPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:UploadPage).
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.UploadPage)が登録されました.
12:40:26 [httpWorkerThread-4848-3] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を終了しました.

なんかログ吐き出すライブラリの動作がおかしいのかな?と心配になってくる。動作はこちらも問題にならず。

Tomcat 6で動作確認

ログがこれまた違う。

13:15:04,874 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
13:15:04,874 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
13:15:04,905 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Popping appender named [STDOUT] from the object stack
13:15:04,905 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - org.t2framework level set to DEBUG
13:15:04,905 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - commons level set to DEBUG
13:15:04,905 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - lucy level set to DEBUG
13:15:04,905 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - examples level set to DEBUG
13:15:04,905 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - root level set to INFO
13:15:04,905 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[root]
13:15:04,905 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を開始しました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - 対象パッケージ(examples.page)、対象URL(file:/C:/_product/_test/t2_04sample_nb/build/web/WEB-INF/classes/examples/page/)に対してクラスの登録処理を試みます.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:AddPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.AddPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:CheckboxPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.CheckboxPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:DownloadPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.DownloadPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:ForeachPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.ForeachPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:GetAndPostPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.GetAndPostPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:HelloPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.HelloPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page/hoge、クラス名:HogePage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.hoge.HogePage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:JsonPage$Hoge).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:JsonPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.JsonPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:MovePage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.MovePage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:NestForeachPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.NestForeachPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:OuterPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.OuterPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:PassThroughPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.PassThroughPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:RequestParamPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.RequestParamPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:SelectPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.SelectPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:SessionAttrPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.SessionAttrPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:TwitterPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.TwitterPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を試みます(パッケージ名:examples/page、クラス名:UploadPage).
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - クラス(examples.page.UploadPage)が登録されました.
13:15:05 [http-8084-1] INFO o.t.contexts.impl.WebApplicationImpl - T2アプリケーションのコンポーネント登録を終了しました.
2008/11/30 13:15:06 org.apache.catalina.core.StandardContext start
情報: コンテナ org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/t2_04sample_nb] は既に起動されています

どうもGlassfish V2とV3のログを足したものが出ている感じ。むむむむ。もしかしてJavaのRIであるGlassfishでの動作確認はしてないのかな。そもそもJBOSS等他のAP鯖でも問題なく動くのだろうか。そういやCubbyGlassfishで異様に起動が遅い現象があったような気がしたがそれとにたようなものだろうか(SAStrutsは問題がなかったことからSeasar2がらみではないことはわかっていた)。


T2の真のサポートをするにはソースを読まないことが大事と思い、0.3のときにソースを読むのを途中でやめたのだがやはりここはソースを読むしかないのだろうか。ソースをよんでしまうと、動作がわかってしまうのでドキュメントのサポートが出来なくなってしまう。ドキュメントを作ってる本人はこの情報で十分だと思っていても、内部動作を知らない人にとってはぜんぜん足りないということが非常に多い。

わかりにくいとかいうのを判断するにはユーザーと同じ立場、つまりドキュメントのみを情報を仕入れる手段としてさわったほうがよい。

というわけで今後どうするかちょっと考える。