DWRにバッチ処理はあるけれども…

Cometの際のバッチ処理はない

サーバを呼び出す際のバッチ処理はあるけれども、Cometするときにはそれがない。

DWR公式ドキュメントのengine.jsの項目を見てみるとこんな風にバッチ処理できる。これによって、何度も通信が発生することを抑えられる。

dwr.engine.beginBatch();

Remote.methodInBatch(params1, callback);
Remote.methodInBatch(params2, callback);
Remote.methodInBatch(params3, callback);

dwr.engine.endBatch({
    timeout:3000
});


Comet(リバースAjax)を使わない場合なら上の方法でもいい。でもCometを使う場合、あんな風に通信の回数を抑えることができない。例えば上に書いたメソッドからCometする場合を考える。

public void methodInBatch(String params){

    WebContext wctx = WebContextFactory.get();
    Collection<ScriptSession> sessions = wctx.getAllScriptSessions();
    ScriptBuffer bf = new ScriptBuffer();		
    bf.appendScript("update(").appendData(params).appendScript(");");

    for (ScriptSession sess : sessions) {
	sess.addScript(bf);
    }
}


クライアントからサーバに通信する段階ではバッチ処理が利用されてるので通信は一度しか発生しない。サーバからクライアントにサーバpushする段階では、methodInBatchメソッドから何度もComet(リバースAjax)が行われてしまう。