[mayaa-user:684] Re: カスタムタグのreleaseメソッド呼び出しのタイミングについて

佐竹雅央 [E-MAIL ADDRESS DELETED]
2008年 8月 25日 (月) 23:25:30 JST


佐竹です。

ご回答ありがとうございます。

> 現状の実装の都合上、ちょっと時間がかかりそうです。
そんな気はしておりました。。。

> NullPointerException のスタックトレースと、発生する Link の利用パターンを
> 教えていただけますでしょうか。

java.lang.NullPointerException
        at org.apache.struts.taglib.html.LinkTag.doStartTag(LinkTag.java:314)
        at org.seasar.mayaa.impl.engine.processor.JspProcessor.doStartProcess(JspProcessor.java:273)
        at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:134)
        at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:153)
        at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:153)
        at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:153)
        at org.seasar.mayaa.impl.engine.RenderUtil.renderProcessorTree(RenderUtil.java:232)
        at org.seasar.mayaa.impl.engine.TemplateImpl.doTemplateRender(TemplateImpl.java:203)
        at org.seasar.mayaa.impl.engine.PageImpl.renderTemplate(PageImpl.java:242)
        at org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:317)
        at org.seasar.mayaa.impl.engine.PageImpl.doPageRender(PageImpl.java:190)
        at org.seasar.mayaa.impl.engine.EngineImpl.doPageService(EngineImpl.java:368)
        at org.seasar.mayaa.impl.engine.EngineImpl.doService(EngineImpl.java:490)
        at org.seasar.mayaa.impl.MayaaServlet.doService(MayaaServlet.java:97)
        at org.seasar.mayaa.impl.MayaaServlet.doGet(MayaaServlet.java:80)
(以下Forward前後の処理を略します、全体は添付ファイルをご参照下さい)

まさか其処まで見ていただけると思わなかったのでStrutsのバージョンを
お伝えしていませんでしたが、1.3.8です。Google ソースコード検索では以下になります。

http://www.google.com/codesearch?hl=ja&q=show:maaR800XgmM:k8YDhHyUsuo:OH7j7Ted_EA&sa=N&ct=rd&cs_p=http://ftp.osuosl.org/pub/apache/struts/source/struts-1.3.8-src.zip&cs_f=struts-1.3.8/src/taglib/src/main/java/org/apache/struts/taglib/html/LinkTag.java

LinkTag 314: this.parameters.clear(); で発生しています。
この parameters が、フィールド宣言時に初期化代入されており、
releaseメソッドでnull化される以外に一切代入されていません。
# ちなみに Struts 1.2.x には無かったフィールドの模様です・・・@since Struts 1.3.6 かな

なお、他の使用しているStrutsタグではこのようなパターンの物が見当たらなかったので、
当面はLinkTagのほうを再利用に耐えられる実装に差し替えて運用するつもりです。

・・・ここまで書いて、ふと、まだβのStruts 1.3.9 を見に行ったら、
バグとして修正されていました。
http://struts.apache.org/1.3.9/userGuide/release-notes.html

orz

結局、カスタムタグのライフサイクルは何が正しいんでしょうかね・・・。
(そしてStruts 1.3.9 はいつまでベータなのでしょう・・・)

suga さんのお手を煩わせたことをお詫びします。


以上、宜しくお願い致します。


2008/08/24 23:24 suga <[E-MAIL ADDRESS DELETED]>:
> suga です。
>
> On 8/24/08, 佐竹雅央 <[E-MAIL ADDRESS DELETED]> wrote:
>> ただ、今の仕様ですとStrutsのLinkTagは再利用されれば必ずヌルポが
>> 発生しそうなものですが、実際には極低確率でしか発生していません。
>> それでマルチスレッド利用でのタイミングの問題を疑ったのですが。
>> これは、ソフト参照によるキャッシュが再利用前に消えているのでしょうか・・・
>> 余裕があるときに確認してみたいと思います。
>>
>> > これは Mayaa 実装時に見落としていたことで、少なくとも JSP 2.0 以降では
>> > release() 後の再利用を想定しない実装の方が良さそうに思います。
>> > また、その場合でも JSP 1.2 の範囲内なので、release() は再利用しない
>> > ときに呼ぶ方が良さそうですね。
>>
>> とのことですが、改良版を提供していただくことは可能でしょうか?
>
> 現状の実装の都合上、ちょっと時間がかかりそうです。
> SoftReference をやめて Jasper のような固定サイズ Hard Reference に
> 作り直す方が早いかもしれない、と検討中です。
>
> Struts の LinkTag を見てみたのですが、release() が呼ばれた後で
> 再利用したからといって NullPointerException が発生することは
> ないように思います。
> release() が呼ばれていることが原因ではなく、他に原因があるのでは
> ないでしょうか。
>
> NullPointerException のスタックトレースと、発生する Link の利用パターンを
> 教えていただけますでしょうか。
>
> --
> suga ( [E-MAIL ADDRESS DELETED] )
> _______________________________________________
> mayaa-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/mayaa-user
>


mayaa-user メーリングリストの案内