サンプルをよく見る

blazeds-samples内にあるBlazeDS Test Driveというサンプル群を見てみる。全てのサンプルで「view source」できるからいいね!自分用にメモっとく。

1.Accessing data using HTTPService

flexのmx:HTTPServicでxmlをゲットする。そのxmlはサーバサイドのcatalog.jspで作られる。サーバサイドはRoRPythonPHPとかのHTTPServiceならなんでもいいってことー。AS3はE4Xに対応してるから、簡単に XML データを扱うことができちゃう。crossdomain.xmlなしに別のドメインからアクセスできるようにするにはuseProxyをtrueにして、destinationflex側とサーバサイドのWEB-INF\flex\proxy-config.xmlをちゃんと設定しなきゃいけないよー。ついでに、HTTPとHTTPSの両方に対応してるっと。

2.Accessing data using Web Services

Webサービスを使ってデータにアクセス。mx:WebServiceによって、SOAPベースのWebサービスからActionScriptオブジェクトをゲットできる。そのほかはさっきと同じだけど、あとwsdlもサーバサイドのproxy-config.xmlで設定しなきゃいけない。RPCサービスっていいねー。

3.Accessing data using Remoting

リモートオブジェクト。1つ目のサンプルとは同じような表示なんだけど、コードはこちらのほうがかなり短い。mx:RemoteObjectを使っていて、javaのProductServiceクラスのgetProducts()をActionScriptからリモートで実行できる!

4.Flex Programming Model 101

画面が左右に分割されていて、左の携帯のサムネイルを選ぶと右の画面に詳細が表示される。左のサムネイル画面がThumb.mxmlで、右の詳細画面がProductView.mxml、mx:RemoteObjectによってサーバからデータをとってくる制御用のmain.mxml。つまりModel-View-Controllerとなっています。もちろんCSSファイルも使えます。

5.Updating Data

また左右分割画面。左側のデータを選ぶと、右に詳細が表示され、サーバ側でデータが変更されても「アップデート」ボタンを押せば更新できる。クライアント側はmain.mxml、ProductForm.mxml、Product.asの3つ。商品クラスであるProduct.as(クライアントサイド)内に

 [RemoteClass(alias="flex.samples.product.Product")]

と記述する事で、サーバサイドのjava(WEB-INF\src\flex\samples\product\ProductService.java)にマッピングしている。

6.Publish/Subscribe Messaging (Data Push Use Case)

サーバサイドのjavaがリアルタイムでメッセージ(この場合はチャート?!)のキューを送信するようにして、クライアントサイドではそのキューを受け取るか否かを設定できる。FlexBlazeDSのメッセージサービスを通してメッセージのPublish/Subscribeができる。ProducerとConsumerですね。このサンプルはチャートのデータをConsumerでリクエストする形です。JMS(Java Message Service)が使えるようです。
BlazeDSでは、ストリーミングチャンネルもしくはポーリングチャンネルを用いてメッセージングすることができる。ストリーミングの場合、クライアントがブラウザを閉じるまで、大量のデータが流れ込んでくるが、HTTPのコネクションは全二重でない。つまり両方向でデータのやり取りをするためには2つのコネクションが必要となる。(ストリーミング用(server->client)とデータ要求(client->server)用ですね。)一方、ポーリングでは、クライアントがリクエストする感じ。これじゃあ普通のポーリング方式ですが、ここでは必要なタイミングまでレスポンスは返さず、接続した状態のまま待機します。つまりcometと同じロングポーリング方式ですね。これによって、擬似的にリアルタイムな情報をやりとりできます。結論としてはリアルタイム性の高いコミュニケーションの時は、ストリーミングを選ぼう。
ここで問題なのが同時接続数。一般的なブラウザでは同じドメインへの同時接続数は2つなんです。(firefoxでは8つ!)これはLingrのようなcomet通信でも問題になる所で、同時接続数をオーバーすると接続できなくなります。しかしBlazeDSにはエレガントな解決策が!それは、はじめに繋ぐチャンネル(stream or polling)をmessaging-config.xmlに定義しておく方法。messaging-config.xml

<default-channels>
    <channel ref="my-streaming-amf"/>
    <channel ref="my-polling-amf"/>
</default-channels>

と書くと、最初にストリーミングチャンネルで接続を試み、失敗したらポーリングチャンネルで接続するようになっているようです。ほほー。

7.Publish/Subscribe Messaging (Collaboration Use Case)

ProducerとConsumerがコラボしています。まあ、簡単なチャットです。チャットデータ更新が会ったらConsumerのメッセージハンドラ受け取り、こちらがチャットメッセージを送る時はProducerでsendします。

だいたいわかってきたぞ。で、結局AMFって?!(笑)