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

Mizuno Ken mizuno.ken @ interfactory.co.jp
2017年 6月 22日 (木) 19:31:54 JST


お世話になっております。水野です。

弊社では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 メーリングリストの案内