2010年4月7日水曜日

BlazeDS 入門記(Session life cycle)

BlazeDS architecture / Managing session data / Session life cycle


Disconnecting from an HTTP-based channel


HTTP はステートレスなプロトコルのため、SWF ファイルが切断された時、サーバ上での検出はサーバ上の HTTP セッションタイムアウトのタイミングに依存する。そのため、Flex アプリケーションから BlazeDS サーバに切断を通知させたいのであれば、ChannelSet の disconnectAll() メソッドを JavaScript から呼ばせるようにするとのことらしい。

流れとしては、以下のように disconnectAll() メソッドを用意し、
private function disconnectAll():void {
 remoteObject.channelSet.disconnectAll();
}
これを ActionScript メソッドをコンテナから呼び出し可能なものとして登録するための init() メソッドを用意し、
private function init():void {
 if (ExternalInterface.available) {
  ExternalInterface.addCallback("disconnectAll", disconnectAll);
 }
}

application 要素の creationComplete 属性に init() メソッドを登録します。
creationComplete="init()"

そして JavaScrpt側では
<script type="text/javascript">
    function disconnectAll() {
        document.getElementById("RpcClient").disconnectAll();
    }
</script>
のようにメソッドを用意し、body 要素の onunload 属性を以下のように設定して、unload 時に上記 JavaScrpt の disconnectAll() メソッドが呼ばれるようにします。
<body onunload="disconnectAll()">

実際にやってみたところ、クライアント側では期待通りの動きをしていることは確認できました。でも、サーバ側でうまくできているのか確認するほうほうがよくわかりません。ひとまず TODO:要確認 として、先に進むことにします。


Invalidating an HTTP session

Another complication with using the HTTP protocol is that multiple SWF files share the same HTTP session. When one SWF file disconnects, BlazeDS cannot invalidate the HTTP session. In this scenario, the default behavior on the server is to leave the current session in place for other applications or pages that are using the HTTP session. However, you can use the optional invalidate-session-on-disconnect configuration property in a channel definition in the services-config.xml file to invalidate the session, as the following example shows:
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
    <endpoint url="http://servername:port/contextroot/messagebroker/amf"
        class="flex.messaging.endpoints.AMFEndpoint"/>
    <properties>
        <invalidate-session-on-disconnect>true</invalidate-session-on-disconnect>
    </properties>
</channel>

複数のSWFファイルが接続している状態では、1つのSWFファイルが切断されても HTTP セッションの invalidate をしない。このようなケースで HTTP セッションを invalidate したい場合、services-config.xml ファイルに以下のように invalidate-session-on-disconnect の指定をすると、1つのSWFファイルが切断されると HTTP セッションが invalidate されるようになるという話。

実験してみましたが、残念ながらサーバ側で invalidation されるのを確認できませんでした。これもひとまず TODO:要確認 として、先に進むことにします。

0 件のコメント:

コメントを投稿