[mayaa-user:1054] Re: 巨大なループをサポートする方法

suga [E-MAIL ADDRESS DELETED]
2016年 1月 16日 (土) 00:16:54 JST


suga です。

> もし上手いこと、ForProcessor処理中でも、
> CycleWriterImpl
> をflushできれば、
> クライアントに結果をストリーミングできるのではないかなと思います。

途中状態をどんどんflushしていくと途中でエラーが起きたときに
途中まで書かれてそこで止まり、エラーページを表示することができません。(Velocity なんかはそうですね)
サーバサイドでレンダリングを全部通してから、というのがそのあたりの思想です。
また、途中状態でflushするとしても、子コンポーネントのレンダリング結果を受けて処理する
コンポーネントの場合にはそこで貯めてしまうので同じことになります。

もしそのように変更するとすれば、途中状態をファイルに書き出して、処理が終わったら読み出して、
とすることですが常時そんなことをしては当然処理速度が落ちますので、
何かしらの処理分岐をしたりすることになるでしょう。


なおループの制限を設けているのは、単純にうっかり無限ループになる条件が
起きうる状態でネットに公開してしまうとひどいことになるのでその防止策、だったと思います。
あらかじめ用意したListなどを回すならforEachを使ってね、ということで。
初期値が妥当かはまた別の話ですが。


--
suga ( ko.suga @ gmail.com )


2016-01-15 14:52 GMT+09:00 Susumu ISHIGAMI <susumu.ishigami @ gmail.com>:
> いしがみです。
>
> UserMLで扱う内容なのかどうか悩みつつ、微妙なことを質問させていただきます。
>
> 意地悪な例でMayaaファイルに
>
> <m:for id="LARGE_LOOP" init="${var i = 0;}" test="${i &lt; 256}"
> after="${i++}" />
>
> のように書いて、テンプレートで次のように、無理やり入れ子すると、
>
> <div id="LARGE_LOOP">
> <div id="LARGE_LOOP">
> <div id="LARGE_LOOP">
> <div id="LARGE_LOOP">
> <div id="LARGE_LOOP">
> aaa
> </div>
> </div>
> </div>
> </div>
> </div>
>
> OutOfMemoryErrorが発生します(起動時の割当てヒープ量に依存)
>
> 原因は
> AbstractResponse._stack
> に格納された
> CycleWriterImpl
> の_buffer
> が無限に増殖してしまうためです。
>
> もし上手いこと、ForProcessor処理中でも、
> CycleWriterImpl
> をflushできれば、
> クライアントに結果をストリーミングできるのではないかなと思います。
>
> 実現するための、良いアイデアはありませんでしょうか?
> (例えば、CycleWriterImplが一定のバッファサイズを超えたら自動でwriteOutするようにしたらまずいか?)
>
> これが出来れば、ループの上限も256で制限する必要もなくなり、
> MayaaでCometのような仕組みも作れるのではないかと思います。
>
> 基本的なことなので初期の頃議論済みであれば申し訳ありません。
>
> 以上、よろしくお願い致します。
>
> --
> Susumu ISHIGAMI
> susumu.ishigami @ gmail.com
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user


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