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だけにした方が良いかもです。