ログインフォーム問題というより、ServletRequest の処理問題

これは、どう直すかな・・・。ややこしくて、少々誤認していた部分もあるが、理解するのに時間がかかった。問題は、PortalFilterをかませたときに発生する。PortalFilterがHttpServletRequestWrapperで実装した場合は、PortalFilter->実Request と言う感じにラップする。そんで、Tomcat でポートレットを呼び出すときには、includeの形で呼び出すが、そのときに、Tomcat が ApplicationHttpRequest をPortalFilterと実Request の間に挟み込む。この挟み込みによって、各コンテキスト内でセッションを共有できなくしたり、違うコンテキストとしての動作をする。つまり、Tomcatがポートレットをincludeで呼び出し、挟み込みを行い、Request を書き換えるので、ポートレット内で、JetspeedRequestContextを呼び出したときにはその挟み込まれたRequestを取得してしまい、セッションを取得したときには、ApplicationHttpServletRequestが書き換え、本来のセッションが取得できない。で、ポートレットでの処理が終わったら、TomcatはunwrapRequest()して、元に戻す・・・。

というわけで、HttpServletRequestWrapperによるPortalFilterの実装をやめて、HttpServletRequestをインターフェースして、試してみると、フォワードがダメになる。原因は、forwardしたときに、これまた、そのPortalRequestに対して、ラップ処理を行い、処理が一通り終わったときにunwrapRequest()を実行して、ClassCastExceptionと言う感じ。どうも、unwrapRequest()の終了条件にRequestFacadeクラスかどうかをチェックするところがあり、独自拡張しているPortalFilterはこの条件にマッチしないので、ラップされているRequestと勘違い?して、キャストして親を得ようとする(この動きはバグなのか?仕様っぽくない気もするが)。そんで、終了・・・。つまり、独自拡張したServletRequestで、フォワードするなと言うことか・・・。

うーん、はて、どうしたものかと考える。今思いつく解決策は、「JetspeedRequestContextでセッションを保持するRequest経由で呼び出すのをやめて、privateとかで値を保持する」か、「ServletPortletInvokerとかで、ポートレットの処理に入る前に、Requestを新規に生成する」などだろうか。JetspeedRequestContextを変える方のが楽な気もするな。でも、この問題は、現在はそうなっていないと思うが、ポートレットをマルチスレッドで呼び出したりする拡張を考えると、ポートレット用にRequestをコピーして、それを渡すのが良いのかもな・・・。

姫野ベンチ

マシンのベンチマークをとってみようと思い、Linuxで動くものを探す。姫野ベンチで試すことにした。まぁ、単純計算だけだと思うので、Pentium D の方が、AMD64より早いな・・・(でも、J2のビルド時間はたいしてかわらんのだよな・・・。となるとファイルアクセスの問題か・・・)。

http://hesonogoma.com/linux/UsageOfHimenoBench.html

以下に結果。

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 12
model name      : AMD Athlon(tm) 64 Processor 3200+
stepping        : 0
cpu MHz         : 1000.000
cache size      : 512 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext lm 3dnowext 3dnow
bogomips        : 1997.74
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp
$ ./bmt
mimax = 129 mjmax = 129 mkmax = 257
imax = 128 jmax = 128 kmax =256
Start rehearsal measurement process.
Measure the performance in 3 times.
MFLOPS: 345.597314 time(s): 1.190158 1.733593e-03
Now, start the actual measurement process.
The loop will be excuted in 151 times
This will take about one minute.
Wait for a while
Loop executed for 151 times
Gosa : 1.298434e-03
MFLOPS measured : 644.481833   cpu : 32.123288
Score based on Pentium III 600MHz : 7.859535
$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 4
model name      :               Intel(R) Pentium(R) D CPU 2.80GHz
stepping        : 4
cpu MHz         : 2793.060
cache size      : 1024 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl cid cx16 xtpr
bogomips        : 5592.48
clflush size    : 64
cache_alignment : 128
address sizes   : 36 bits physical, 48 bits virtual
power management:
processor       : 1
vendor_id       : GenuineIntel
cpu family      : 15
model           : 4
model name      :               Intel(R) Pentium(R) D CPU 2.80GHz
stepping        : 4
cpu MHz         : 2793.060
cache size      : 1024 KB
physical id     : 0
siblings        : 2
core id         : 1
cpu cores       : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl cid cx16 xtpr
bogomips        : 5586.36
clflush size    : 64
cache_alignment : 128
address sizes   : 36 bits physical, 48 bits virtual
power management:
$ ./bmt
mimax = 129 mjmax = 129 mkmax = 257
imax = 128 jmax = 128 kmax =256
Start rehearsal measurement process.
Measure the performance in 3 times.
MFLOPS: 802.986553 time(s): 0.512232 1.733593e-03
Now, start the actual measurement process.
The loop will be excuted in 351 times
This will take about one minute.
Wait for a while
Loop executed for 351 times
Gosa : 1.085755e-03
MFLOPS measured : 830.342226   cpu : 57.956709
Score based on Pentium III 600MHz : 10.126125