[mayaa-user:1080] Re: XXXProcessor#doStartProcess での child 書き換えに関するご相談

Mizuno Ken mizuno.ken @ interfactory.co.jp
2017年 6月 28日 (水) 15:08:43 JST


suga様

お世話になっております。水野です。
アドバイスありがとうございます。

アドバイスに基づきafterBuild での対応を検討したのですが、書き換えのために再度ツリーを走査するのが性能面でデメリットに感じました。
そのため、代わりの方法として下記を考えております。
- afterBuild から間接的に呼び出されている walkParsedTree をオーバーライドし、
- super.walkParsedTree を呼び出した後、
- stack.peek() で取得したオブジェクトに対して書き換え処理を実施

もし、上記の方法において性能面・機能面での懸念点があればお知らせいただけますでしょうか。





2017年6月25日 17:49 suga <ko.suga @ gmail.com>:
> suga です。
>
>> 2. 上記の child ノードの書き換え処理を実現する、より適切な方法はありますか?
>
> ServiceProvider の設定ファイルで TemplateBuilderImpl を継承した自作のものに入れ替えて afterBuild
> で処理するというのが妥当に思えます。
>
> ServiceProvider の設定ファイルの置き方
> http://mayaa.seasar.org/documentation/engine_settings.html
>
> 元のファイルは以下のパスにあります。
> mayaa/src-impl/org/seasar/mayaa/impl/provider/factory/org.seasar.mayaa.provider.ServiceProvider
>
> この元ファイルの
> <templateBuilder class="org.seasar.mayaa.impl.builder.TemplateBuilderImpl">
> のノードを丸々コピーしてクラス名を自作のものに変えれば入れ替えは終わりです。
>
> この TemplateBuilderImpl のソースは
> https://github.com/seasarorg/mayaa/blob/master/src-impl/org/seasar/mayaa/impl/builder/TemplateBuilderImpl.java
>
> 継承したクラスで afterBuild をoverrideしてsuper.afterBuildを呼んだ後、書き換えの処理をすれば良いと思います。
>
>
>
> 2017年6月22日(木) 19:32 Mizuno Ken <mizuno.ken @ interfactory.co.jp>:
>>
>> お世話になっております。水野です。
>>
>> 弊社ではmayaaに対していくつか拡張を行った上で利用しており、その拡張の実現方法についてご相談に乗っていただけますでしょうか。
>>
>> ■ 現状の課題
>> IfProcessorやForProcessorの子クラスを作成し、doStartProcess
>> をオーバーライドして以下のような処理を行っています。
>> - 初回の呼び出し時に限り、 child ノードの書き換えを行う
>> - 2回目以降の呼び出し時には、何もしない。(super.doStartProcessを呼び出すだけ)
>>
>> その結果、上記の child
>> ノードの書き換え処理と、org.seasar.mayaa.impl.engine.specification.serialize.SerializeThread
>> による
>> キャッシュの書き出しが同時に発生した場合、キャッシュの内容が破壊される(書き換え途中の状態がキャッシュされてしまう)
>> という現象が発生しています。
>>
>> ■ 相談内容
>>
>> 1. TemplateProcessorSupport#writeObject を synchronizedメソッドとすることは問題ないでしょうか?
>>
>> synchronizedとすることで、child ノードの書き換え途中の状態がキャッシュされることがなくなりますが、この対応による副次的な
>> 問題は発生しますでしょうか?
>> 特に、デッドロック発生の可能性について危惧しているので、「SerializeThread によるシリアライズ処理の順序(=親→子の順)
>> とは異なる順序でオブジェクトをロックしている処理がないか」を教えていただけると助かります。
>>
>> 2. 上記の child ノードの書き換え処理を実現する、より適切な方法はありますか?
>>
>> doStartProcess は本来 node
>> の書き換えを行うべき場所ではないと思いますので、より適切な場所があればお知らせいただけますでしょうか。
>> 例えば、下記のようなタイミングで呼び出されるメソッドが XXXProcessor にあるとベストです。
>> - mayaa の標準的な処理によって node の構造が構築された後
>> - 初めてレンダリング処理が行われる前 (できれば、SerializeThread によるキャッシュ書き出しの前)
>>
>> かなり特殊な目的に対する質問で恐縮ですが、ご確認いただけると幸いです。
>> よろしくお願いいたします。
>>
>> --
>> 株式会社インターファクトリー   水野 謙
>> mizuno.ken @ interfactory.co.jp
>>
>> 〒102-0071
>> 東京都千代田区富士見2-10-2 飯田橋グラン・ブルーム4階
>> TEL:03-5211-0056 / FAX:03-5211-0059
>> http://www.interfactory.co.jp
>> _______________________________________________
>> mayaa-user mailing list
>> mayaa-user @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>
>
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user



-- 
株式会社インターファクトリー   水野 謙
mizuno.ken @ interfactory.co.jp

〒102-0071
東京都千代田区富士見2-10-2 飯田橋グラン・ブルーム4階
TEL:03-5211-0056 / FAX:03-5211-0059
http://www.interfactory.co.jp


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