S3BlazeDSでのHotReloading対応を考えてみた
S3BlazeDSのHotReloading対応についてちょっと試してみた
S2BlazeDSっぽくJavaFactory等を継承して何とかできそうな気がしてたけど、あと少しうまくいかないところがありました。
やってみた事
S3JavaFactory作成
package flex.messaging.factories; public class S3Factory extends JavaFactory { private static final String ATTRIBUTE_ID = "attribute-id"; private static final int SINGLETON_ERROR = 10656; private static final int INVALID_CLASS_FOUND = 10654; @SuppressWarnings("unchecked") @Override public FactoryInstance createFactoryInstance(String id, ConfigMap properties) { JavaFactoryInstance instance = null; //開発サーバーのみS3FactoyInstanceを使用する if (AppEngineUtil.isDevelopment()) { instance = new S3FactoryInstance(this, id, properties); } else { instance = new JavaFactoryInstance(this, id, properties); } if (properties == null) { ...省略 } }
S3JavaFactoryInstance作成
public class S3FactoryInstance extends JavaFactoryInstance { public S3FactoryInstance(JavaFactory factory, String id, ConfigMap properties) { super(factory, id, properties); } @Override @SuppressWarnings("unchecked") public Class getInstanceClass() { //HotReloading対応 return org.slim3.util.ClassUtil.forName(getSource()); } }
S3Adapter作成
public class S3Adapter extends JavaAdapter { @Override public void setDestination(Destination destination) { RemotingDestination dest = (RemotingDestination) destination; dest.setFactory(new S3Factory()); super.setDestination(dest); } }
remoting-config.xmlでS3Adapterを使用する様に変更します。
これで一件動いているように見えるけど、
applicationスコープがダメっぽいです。
requestスコープとsessionスコープはいけてます。
なんで?
Slim3のHotReloading全部読んでるわけじゃないけど、
なんとなくapplicationスコープのオブジェクトはServletContextで管理されてるだろうからOKだろうと思ってた。
BlazeDSのソース(JavaFactoryInstanceのlookup辺り)を眺めてみた感じだと、
applicationスコープのオブジェクトは、JavaFactoryInstanceのインスタンス変数で管理されているっぽいですね。
sessionスコープはHttpSessionで管理されてるのに、なんでapplicationだけこんな事してるんだろ…
JavaFactoryInstanceはどこで管理されてるのか追いかけてないけど、
HotReloadingされないって事はBlazeDS独自の仕組みで管理されてるような気がします。
結構簡単にイケそうな気がしてたけど、
意外と面倒くさいかもしれない。
S2だとスコープとかSeasarが管理してくれるのでBlazeDS無視してOKだったかもだけど、Slim3の場合は、BlazeDSに管理してもらう必要ありって事でややこしいかな。
というか、想像でやってる部分が多すぎるので、一回きちんとソース読んだ方が良いのだろう
いずれにしても、GAEでBlazeDS使う場合は、applicationスコープ使わない方が良いかも
ちょっと実験すれば分かってた事ですが、
ソース読んだ感じだとapplicationスコープのオブジェクトは起動時に初期化されてるっぽいですね。(知らなかった)
spin-upを考慮するとなるべくrequestかsessionだけにした方が良いかもです。