BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR...

63
Blaze DS 理解す 株式会社 横田 聡こた さとし http://www.classmethod.jp/ 1 CLASSMETHOD 2007/12/21

Transcript of BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR...

Page 1: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Blaze DS

を理解する

クラスメソッド株式会社

横田聡(よこたさとし)

http://www.classmethod.jp/

1CLASSMETHOD2007/12/21

Page 2: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

自己紹介

• まいどsato-shiです。

• http://d.hatena.ne.jp/sato-shi/

• http://www.classmethod.jp/

2007/12/21 CLASSMETHOD 2

Page 3: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

アジェンダ

• BlazseDSとは

• リモート通信

• メッセージ配信

• JMS連携

• その他

3CLASSMETHOD2007/12/21

Page 4: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

BlazeDSとは

• BlazesDSは、FlexやAIRなどクライアントからサーバーのデータソー

スにアクセスする方法を提供するサーバーソフトウェアコンポーネントです。

• Javaアプリケーションサーバー上のコンテキストとして動作(war)– 主要JavaAPサーバー対応

– Tomcat対応

• 主な機能は以下の3つ• 主な機能は以下の3つ– RPC Service

• リモート通信, ( Httpサービス, Webサービス )

– Message Service

• データプッシュ, JMS連携

4CLASSMETHOD2007/12/21

Page 5: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

FlexとBlazeDSの関係

Flexアプリ(アプリ(アプリ(アプリ(Flashアプリ)アプリ)アプリ)アプリ)

RemoteObjectService

MessagingService

WebService

HttpService

ブラウザブラウザブラウザブラウザ

FlashPlayer

JVM

JavaAPサーバーサーバーサーバーサーバー

BlazeDS

MessagingService

5CLASSMETHOD2007/12/21

Page 6: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

AIRとBlazeDSの関係

Flexアプリ(アプリ(アプリ(アプリ(Flashアプリ)アプリ)アプリ)アプリ)

RemoteObjectService

WebService

HttpService

MessagingService

AIRラインタイムラインタイムラインタイムラインタイム

FlashPlayer/HTMLエンジンエンジンエンジンエンジン

JVM

JavaAPサーバーサーバーサーバーサーバー

BlazeDS

6CLASSMETHOD2007/12/21

MessagingService

Page 7: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

BlazeDSの実体

• 特殊なことをやっているのでしょうか?→NO

web.xml

services-

config.xml

MessageBroker

Servlet

remoting-

config.xml

proxy-

config.xml

・通信・通信・通信・通信Channel

・リモート通信・リモート通信・リモート通信・リモート通信

・・・・HTTPプロキシプロキシプロキシプロキシ・・・・SOAPプロキシプロキシプロキシプロキシ

・初期ロード・初期ロード・初期ロード・初期ロード

config.xml

messaging-

config.xml

・通信・通信・通信・通信Channel

・ロール・ロール・ロール・ロール・メッセージ・メッセージ・メッセージ・メッセージ

プッシュ配信やプッシュ配信やプッシュ配信やプッシュ配信やRPCをサポートするライブラリ集をサポートするライブラリ集をサポートするライブラリ集をサポートするライブラリ集とそれらを管理するフレームワークとそれらを管理するフレームワークとそれらを管理するフレームワークとそれらを管理するフレームワーク

・・・・Factory

7CLASSMETHOD2007/12/21

Page 8: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

BlazeDSと他フレームワークの連係例

• BlazeDSの仕組みのみで全て構築するのでしょうか?→NO

BlazeDS Spring Hibernate

BlazeDS Service Dao

Service

BlazeDS Seasar2 S2Dao

Factoryのののの仕組みを利用仕組みを利用仕組みを利用仕組みを利用

Service

いつもの仕組みと連携可能いつもの仕組みと連携可能いつもの仕組みと連携可能いつもの仕組みと連携可能

POJO

8CLASSMETHOD2007/12/21

Page 9: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

リモート通信リモート通信リモート通信リモート通信

ものすごい生産性向上

9CLASSMETHOD2007/12/21

Page 10: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

リモート通信

• サーバーサイドJavaのメソッドを直接呼び出すことができ、引数や戻り値の型を自動的にマッピングすることができる。– HTTP上のAMF(ActionScript Message Format)型で通信

• 通信は非同期で行われる。

• 戻り値はイベントハンドラーによって通知される。(ResultEvent)

• 例外はイベントハンドラーによって通知される。(FaultEvent)• (FaultEvent)

ServerClient

Request

ResultEvent /FaultEvent

RemoteObject

AMF通信通信通信通信

Java

10CLASSMETHOD2007/12/21

Page 11: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

AMF(ActionScript Message Format)型

• RemoteObject通信を行う際のデータフォーマット

• SOAPやJSONなどのテキストベースではなくバイナリー

• サイズが小さく、他の通信プロトコルより少ない帯域幅を使用– 例) http://www.jamesward.org/blazebench/

• StrongTypeオブジェクトのエンコードをサポート

• FMS(Flash Media Server)などの動画配信でも使われている• FMS(Flash Media Server)などの動画配信でも使われている

11CLASSMETHOD2007/12/21

Page 12: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

イベントモデル

リスナーリスナーリスナーリスナーディスパッチャーディスパッチャーディスパッチャーディスパッチャーメッセージメッセージメッセージメッセージ

ハンドラーハンドラーハンドラーハンドラーアクションアクションアクションアクション

イベントイベントイベントイベント

12CLASSMETHOD2007/12/21

Page 13: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

RemoteObjectの簡単な例

remoting-

config.xmlRequest

ResultEventDataGrid

RemoteObject

Button

Server

ProductService

Client

ResultEvent

Handler

DataGrid

ProductDao

13CLASSMETHOD2007/12/21

Page 14: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

サービスクラス(Java)の記述

public class ProductService{

public Product getProductById(int productId) throws Exception{

return productDao.getProductById(productId);

}

public List getAllProducts(){

return productDao.getAll();POJO

return productDao.getAll();

}

}

Listやクラスをやクラスをやクラスをやクラスを引数や戻り値に指定引数や戻り値に指定引数や戻り値に指定引数や戻り値に指定

例外を指定可能例外を指定可能例外を指定可能例外を指定可能

14CLASSMETHOD2007/12/21

Page 15: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

サービスの登録

remoting-config.xml

<destination id=“productService”>

<properties>

<source>foo.ProductService</source>

<scope>application</scope>

</properties>

ユニークID

スコープapplication

クラス名

</properties>

</destination>

application

session

request

15CLASSMETHOD2007/12/21

Page 16: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Clientの記述

MXMLの記述<mx:RemoteObject

id="myService"

destination=“productService"

result="resultHandler(event)"

fault="faultHandler(event)"/>

ActionScriptの記述ActionScriptの記述import mx.rpc.remoting.RemoteObject;

var myService:RemoteObject = new RemoteObject();

myService.destination = “productService";

myService.addEventListener("result", resultHandler);

myService.addEventListener("fault", faultHandler);

16CLASSMETHOD2007/12/21

Page 17: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Clientの記述

全てのアイテムを取得<mx:Button label="Get All Data"

click="myService.getAllProducts()"/>

引数を指定して取得<mx:Button label="Get Data"

click="myService.getProductById(100)"/>

クリックイベントクリックイベントクリックイベントクリックイベント

17CLASSMETHOD2007/12/21

Page 18: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

結果のバインド

イベントハンドラーで指定せずに戻り値で指定するにはserviceid.methodName.lastResult

具体的には<mx:DataGrid

dataProvider="{myService.getAllProducts.lastResult}"/>

18CLASSMETHOD2007/12/21

Page 19: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

RemoteObjectのイベントを捕捉する

• result

– サーバーの呼び出しに成功した場合に発生するイベント

– mx.rpc.events.ResultEventのインスタンス

– イベントのresultプロパティに戻り値データが入ってくる

• fault

– サーバーの呼び出しに失敗した場合に発生するイベント

– mx.rpc.events.FaultEventのインスタンス– mx.rpc.events.FaultEventのインスタンス

– イベントのfaultプロパティに例外/エラー情報が入ってくる

19CLASSMETHOD2007/12/21

Page 20: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

カスタムイベントハンドラー

カスタムイベントハンドラーの定義[Bindable]

private var products:ArrayCollection;

private function resultHandler(event:ResultEvent):void {

products = event.result as ArrayCollection;

}

イベントリスナーresult=resultHandler(event);

20CLASSMETHOD2007/12/21

Page 21: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

複数のメソッドにハンドラー

methodタグに記述<mx:RemoteObject id="myService"

destination=“productService"

fault="faultHandler(event)">

<mx:method name="getAllProducts"

result="getAllHandler(event)"/>

<mx:method name="getProductByID"<mx:method name="getProductByID"

result="getOneHandler(event)"/>

</mx:RemoteObject>

21CLASSMETHOD2007/12/21

Page 22: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

ActionScriptクラスのマッピング

• クラス指定しなければObject型として扱う

• RemoteClass指定をしたクラスを指定すれば値をマッピングする

package{

[RemoteClass(alias="Product")]

public class Product{

public var name:String;public var name:String;

public var price:int;

}

}

• ResultEventのresultからクラスへキャスト

var p:Product = Product(event.result);

22CLASSMETHOD2007/12/21

Page 23: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

メッセージ配信メッセージ配信メッセージ配信メッセージ配信

BlazeDSの基本テクノロジ

23CLASSMETHOD2007/12/21

Page 24: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Flex Message Service

• BlazeDSの基本機能のひとつ

• 複数Client環境下でのClient-Server間メッセージ送受信

• 送信側<mx:Producer> と受信側<mx:Consumer>

• Serverからのメッセージはdestinationを通じて行われる

24CLASSMETHOD2007/12/21

Page 25: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

プッシュ配信の仕組み

• BlazeDS

– ポーリング型(Comet)

– ステートフルセッション型

• LCDS

– RTMP型

2007/12/21 CLASSMETHOD 25

HTTPの特徴はステートレスである。の特徴はステートレスである。の特徴はステートレスである。の特徴はステートレスである。(リクエスト&レスポンスで接続状態が切れる)(リクエスト&レスポンスで接続状態が切れる)(リクエスト&レスポンスで接続状態が切れる)(リクエスト&レスポンスで接続状態が切れる)ここでリクエストに対してレスポンスにここでリクエストに対してレスポンスにここでリクエストに対してレスポンスにここでリクエストに対してレスポンスに時間を掛けてプッシュ配信している時間を掛けてプッシュ配信している時間を掛けてプッシュ配信している時間を掛けてプッシュ配信しているように見せかける技術がように見せかける技術がように見せかける技術がように見せかける技術がComet。。。。

この使い方をすると、サーバー側に多大なこの使い方をすると、サーバー側に多大なこの使い方をすると、サーバー側に多大なこの使い方をすると、サーバー側に多大な負荷が掛かるためサーバーを強くするか、負荷が掛かるためサーバーを強くするか、負荷が掛かるためサーバーを強くするか、負荷が掛かるためサーバーを強くするか、利用者を制限するなどの措置が必要。利用者を制限するなどの措置が必要。利用者を制限するなどの措置が必要。利用者を制限するなどの措置が必要。

Page 26: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

メッセージの例

messaging-

config.xml

Producer

Consumer

Button

ServerClient

Handler

Button

26CLASSMETHOD2007/12/21

Page 27: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Destinationの登録

messaging-config.xml

<destination id=“fooDestination”>

<channels>

<channel ref=“my-polling-amf”/>

<channels>

</destination>

ロングポール型ロングポール型ロングポール型ロングポール型

</destination>

<destination id=“barDestination”>

<channels>

<channel ref=“my-streaming-amf”/>

<channels>

</destination>

27CLASSMETHOD2007/12/21

ステートフルセッション型ステートフルセッション型ステートフルセッション型ステートフルセッション型

Page 28: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Producerの記述

• ProducerはClientからServerのdestination宛にメッセージを送信します。

• Flexアプリ内にて<mx:Producer>と記述します。

• destination名は設定ファイル内のidを指定します。<mx:Producer id=“producer” destination=“fooDestination"/>

28CLASSMETHOD2007/12/21

Page 29: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

メッセージ送信の方法

• AsyncMessageクラスを使います。

• Body部にメッセージ本文に記述します。

• Header部に追加情報を記述します。

• Sendメソッドでメッセージ送信します。

import mx.messaging.messages.AsyncMessage;import mx.messaging.messages.AsyncMessage;

var message:AsyncMessage = new AsyncMessage();

message.headers.user = user;

message.body = msg.text;

producer.send(message);

29CLASSMETHOD2007/12/21

Page 30: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Consumerの記述

• ConsumerはServerのdestinationからClientに送られるメッセージを受信します。

• Flexアプリ内にて<mx:Consumer>と記述します。

• destination名は設定ファイル内のidを指定します

<mx:Consumer id=“consumer” destination=“fooDestination"/>

• Subscribeメソッドによってメッセージの受信を開始します。• Subscribeメソッドによってメッセージの受信を開始します。

consumer.subscribe();

30CLASSMETHOD2007/12/21

Page 31: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

メッセージの受信

• メッセージが受信されると、Consumerはmessageイベントをディスパッチします。

• ディスパッチされるイベントオブジェクトはMessageEventです。

• イベントオブジェクトのmessageプロパティはAsyncMessageのインスタンスです。

• イベントハンドラーの記述•

private function messageHandler(event:MessageEvent):void {

mx.controls.Alert.show(

event.message.body, "Message received from " +

event.message.headers.user);

}

• Consumerのイベントを監視します。

message="messageHandler(event)"

31CLASSMETHOD2007/12/21

Page 32: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

特定Clientグループへのメッセージ送信

Group1

Group1

Group2

Server

Client

32CLASSMETHOD2007/12/21

Page 33: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Subtopic

• サブトピック機能を利用すると、Producerコンポーネントが宛先に

送信するメッセージを特定のカテゴリまたはサブトピックに分配することができます。また、宛先にサブスクライブするConsumerコン

ポーネントが、特定のサブトピックまたは一連のサブトピックに送られたメッセージだけを受信するようにも設定できます。複数のサブトピックのメッセージを送受信するにはワイルドカード文字(*)を使用します。使用します。

33CLASSMETHOD2007/12/21

Page 34: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Subtopicの指定(ActionScript)

private function initApp():void{

consumer.subtopic = "chat.fds.*";

consumer.subscribe();

}

private function send():void

{

var message:IMessage = new AsyncMessage();var message:IMessage = new AsyncMessage();

message.headers = new Array();

message.body.chatMessage = msg.text;

producer.subtopic = "chat.fds.newton";

producer.send(message);

msg.text = "";

}

34CLASSMETHOD2007/12/21

Page 35: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

messaging-config.xmlの指定

<destination id="chat">

<properties>

<network>

<session-timeout>0</session-timeout>

</network>

<server>

<max-cache-size>1000</max-cache-size>

<message-time-to-live>0</message-time-to-live><message-time-to-live>0</message-time-to-live>

<durable>false</durable>

<allow-subtopics>true</allow-subtopics>

<subtopic-separator>.</subtopic-separator>

</server>

</properties>

</destination>

35CLASSMETHOD2007/12/21

Page 36: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Selector

• JMSの宛先においてサブトピックを使用することはできませんが、JMSを使用する場合は代わりにメッセージのヘッダとConsumerセレクタ式を利用することで、同様の機能が実現できます。– デフォルト指定

– Java経由でメッセージを受信する

• MessageBroker

• AsyncMessage• AsyncMessage

– JMS経由でメッセージを受信する

36CLASSMETHOD2007/12/21

Page 37: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Selectorの指定(ActionScript)

private function initApp():void{

consumer.selector = "prop1 > 10";

consumer.subscribe();

}

private function send():void

{

var message:IMessage = new AsyncMessage();var message:IMessage = new AsyncMessage();

message.headers = new Array();

message.headers["prop1"] = value1;

message.body.chatMessage = msg.text;

producer.send(message);

msg.text = "";

}

37CLASSMETHOD2007/12/21

Page 38: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

JavaでHeaderを付ける

AsyncMessage msg = new AsyncMessage();

msg.setDestination("feed");

msg.setClientId(clientID);

msg.setMessageId(UUIDUtils.createUUID(false));

msg.setTimestamp(System.currentTimeMillis());

msg.setBody(new Double(currentValue));msg.setBody(new Double(currentValue));

Map map = new HashMap();

map.put("prop1", "5");

msg.setHeaders(map);

msgBroker.routeMessageToService(msg, null);

38CLASSMETHOD2007/12/21

Page 39: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

SelectorはSQL92形式

• Selectorの書き方– SQL文形式

– 一致するメッセージのみ購読する

– メッセージのヘッダ情報から条件指定

– 指定時にサーバに

"*" ...

"/" ...

"+" ...

"-" ...

"not" "like" ...

"not" "in" ...

"not" "between" ...

"=" ...– 指定時にサーバに購読条件が指定される

– 条件外のメッセージは配信されない

"=" ...

"<>" ...

">" ...

">=" ...

"<" ...

"<=" ...

39CLASSMETHOD2007/12/21

Page 40: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

JMS連携連携連携連携

Java標準メッセージ仕様と連携する

40CLASSMETHOD2007/12/21

Page 41: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Httpの世界

• 接続を維持しないステートレスなプロトコル

• リクエスト無しにデータを取得するのは難しい

リクエストリクエストリクエストリクエスト

レスポンスレスポンスレスポンスレスポンス

41CLASSMETHOD2007/12/21

Page 42: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

JMS(Java Messaging Service)

• MOM (メッセージ指向ミドルウェア )にアクセスするための標準API

• Publish / Subscribe メッセージモデル

コンシューマコンシューマコンシューマコンシューマ

メッセージプロデューサメッセージプロデューサメッセージプロデューサメッセージプロデューサトピックトピックトピックトピック

コンシューマコンシューマコンシューマコンシューマメッセージメッセージメッセージメッセージ メッセージメッセージメッセージメッセージ

コンシューマコンシューマコンシューマコンシューマ

コンシューマコンシューマコンシューマコンシューマ

コンシューマコンシューマコンシューマコンシューマ

メッセージコンシューマメッセージコンシューマメッセージコンシューマメッセージコンシューマ

(トピックサブスクライバ)(トピックサブスクライバ)(トピックサブスクライバ)(トピックサブスクライバ)

42CLASSMETHOD2007/12/21

Page 43: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

JMSの設定

• アプリケーションサーバの設定をする– 今回はJRun

– Tomcat、JOTM、ActiveMQを使っても実現可能

• Tomcat・・・http://tomcat.apache.org/

• JOTM・・・ http://jotm.objectweb.org/

• ActiveMQ・・・http://www.activemq.org/site/home.html

• リソース情報としてJMSの宛て先を登録• リソース情報としてJMSの宛て先を登録– C:¥fds2¥jrun4¥servers¥default¥SERVER-INF¥jrun-resources.xml

<jms-destination>

<jndi-name>jms/topic/flex/FlexMessengerTopic</jndi-name>

<destination-name>FlexMessengerTopic</destination-name>

<destination-type>javax.jms.Topic</destination-type>

</jms-destination>

43CLASSMETHOD2007/12/21

Page 44: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

messagingmessaging--config.xmlconfig.xmlの記述の記述<destination id="messenger-topic-jms">

<properties>

<server>

<durable>false</durable>

<durable-store-manager>flex.messaging.durability.FileStoreManager</durable-store-manager>

</server>

<jms>

<destination-type>Topic</destination-type>

<message-type>javax.jms.ObjectMessage</message-type>

<connection-factory>jms/flex/TopicConnectionFactory</connection-factory>

<destination-jndi-name>jms/topic/flex/FlexMessengerTopic</destination-jndi-name>

<delivery-mode>NON_PERSISTENT</delivery-mode>

<message-priority>DEFAULT_PRIORITY</message-priority>

<acknowledge-mode>AUTO_ACKNOWLEDGE</acknowledge-mode>

<transacted-sessions>false</transacted-sessions>

</jms>

</properties>

<channels>

<channel ref="my-rtmp"/>

</channels>

<adapter ref="jms"/>

</destination>

44CLASSMETHOD2007/12/21

Page 45: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

その他その他その他その他

いろいろ

45CLASSMETHOD2007/12/21

Page 46: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

設定ファイルを書きたくない!

• ランタイム設定ができます。– remoting-config.xml

– messaging-config.xml

– data-management-config.xml

• AbstractBootstrapServiceを継承– Initializeメソッド

– Startメソッド– Startメソッド

– Stopメソッド

• services-config.xml

<service class=“foo.MyBootstrapService" id=“myBootstrap"></service>

46CLASSMETHOD2007/12/21

Page 47: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

BootstrapServiceの記述public void initialize(String id, ConfigMap properties) {

remotingService = (RemotingService) getMessageBroker().getService("remoting-service");

RemotingDestination destination = (RemotingDestination) remotingService.createDestination(id);

destination.setSource("flex.samples.crm.employee.EmployeeDAO");

dataService = (DataService) getMessageBroker().getService("data-service");

DataDestination destination = (DataDestination) dataService.createDestination(id);

destination.addChannel("my-rtmp"); // If omitted, default channel will be used

destination.setSource("flex.samples.crm.employee.EmployeeAssembler");destination.setSource("flex.samples.crm.employee.EmployeeAssembler");

destination.setScope("application");

}

規約ベースで書けるはず。規約ベースで書けるはず。規約ベースで書けるはず。規約ベースで書けるはず。

47CLASSMETHOD2007/12/21

Page 48: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Server処理のデバッグ

• services-config.xml

<logging>

<target class="flex.messaging.log.ConsoleTarget" level="Debug">

<properties>

<prefix>[Flex] </prefix>

<includeDate>false</includeDate>

<includeTime>false</includeTime>

<includeLevel>true</includeLevel>

<includeCategory>false</includeCategory><includeCategory>false</includeCategory>

</properties>

<filters>

<pattern>Endpoint.*</pattern>

<pattern>Service.*</pattern>

<pattern>Message.*</pattern>

<pattern>DataService.*</pattern>

<pattern>Configuration</pattern>

</filters>

</target>

</logging>

48CLASSMETHOD2007/12/21

Page 49: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

BlazeDSでクラスタリング

• JGroupsを使ってできます。

• JGroupsとは、TCP/UDP/JMSなどを使ったマルチキャストを実現するオープンソースライブラリ

• JBossとかでも使われているみたい。

2007/12/21 CLASSMETHOD 49

Page 50: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

BlazeDSでWSRP

• WSRP(Web Services for Remote Portlets )と連携。

• WSRP内にBlazeDSのポートレット表示ができる。

2007/12/21 CLASSMETHOD 50

Page 51: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

BlazeDSでQoS

• サーバーとクライアントでキューイングしている。

• クライアントごとに配信するデータをまとめることができる。

2007/12/21 CLASSMETHOD 51

Page 52: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

BlazeDSにはにはにはには無くて、無くて、無くて、無くて、LCDSにある機能。にある機能。にある機能。にある機能。

データ管理データ管理データ管理データ管理

データの衝突を回避しながら同期をとる

52CLASSMETHOD2007/12/21

Page 53: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Data Managementの機能

• Client-Server間及びServer-DB間のデータ管理– 自動リフレッシュによる反映

– マニュアルリフレッシュによる反映

通知通知通知通知

更新更新更新更新 同期同期同期同期

通知通知通知通知

Client

Server DB

53CLASSMETHOD2007/12/21

Page 54: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

データ同期の仕方

• Adapter

– ASObjectAdapter:おまかせ(デフォルト動作)

– JavaAdapter:Javaで指定

• Assembler

– 自作Assembler:

» AbstractAssemblerを継承して作成

• Fill、getItem、createItem、updateItem、deleteItemを記述– SQLAssembler

» SQL文で指定

– HibernateAssembler

» Hibernateにおまかせ

自作自作自作自作Assembler

自作自作自作自作Service

自作自作自作自作Dao

54CLASSMETHOD2007/12/21

Page 55: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

トランザクション autoCommit = true

• 管理対象のデータ変更イベントで即時更新

data-management-config.xml

<destination id="notes">

<adapter ref="actionscript"/>

<properties>

<metadata><metadata>

<identity property="noteId"/>

</metadata>

</properties>

</destination>

55CLASSMETHOD2007/12/21

Page 56: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

DataServiceの記述(autoCommit = trueの場合)public var noteObj:Object = new Object();

[Bindable]

public var getToken:AsyncToken;

private var ds:DataService;

private function initApp():void

{

ds = new DataService("notes");

ds.autoCommit = true;

noteObj.noteId = 1;noteObj.noteId = 1;

getToken = ds.getItem({noteId:noteObj.noteId}, noteObj);

}

]]>

</mx:Script>

<mx:Binding source="log.text" destination="getToken.result.noteText"/>

<mx:TextArea id="log" width="100%" height="100%" text="{getToken.result.noteText}"/>

56CLASSMETHOD2007/12/21

Page 57: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

DataServiceの記述(autoCommit = falseの場合)private function initApp():void

{

ds = new DataService("notes");

ds.autoCommit = false;

ds.addEventListener(DataConflictEvent.CONFLICT, function (event:DataConflictEvent):void

{

Alert.show("Conflicts detected, reverting to server value.", "Conflicts");

event.conflict.acceptServer();

}); データ衝突時のエラーハンドラデータ衝突時のエラーハンドラデータ衝突時のエラーハンドラデータ衝突時のエラーハンドラ

noteObj.noteId = 1;

noteObj.noteText = "Type your notes here and share them with other clients!";

getToken = ds.getItem({noteId:noteObj.noteId}, noteObj);

}

]]>

</mx:Script>

<mx:Binding source="log.text" destination="getToken.result.noteText"/>

<mx:TextArea id="log" width="100%" height="100%" text="{getToken.result.noteText}"/>

<mx:Button label="Send" click="ds.commit();"/>

57CLASSMETHOD2007/12/21

Page 58: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

トランザクション autoCommit = false

• クライアントに変更のキューが蓄積される。

• 可能であれば新しい変更と古い変更をマージする。

• use-transactions=true でコミット

– トランザクション開始

– createItem, updateItem, deleteItem メソッドの呼び出し

– コミット/ロールバック

• use-transactions=falseでコミット

– createItem, updateItem, deleteItem メソッドの呼び出し

– 最初のエラーで停止

• どれも成功したら表示をリフレッシュする

• 変更の成功を他のClientに通知する

58CLASSMETHOD2007/12/21

Page 59: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Data Managementのアーキテクチャー

59CLASSMETHOD2007/12/21

Page 60: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Strong vs. Weak Types

• ClientとServerの双方で、strong と weak typeを使える。

• Weak types: ActionScriptではObject型, Javaではjava.util.Map型

• Client strong, Server strong:

– Javaにリンクするクラスを必ず記述します。[RemoteClass]指定。

– Best practice:自動コード生成ツールを使う

• Client weak, Server strong:

– Client上で扱う大きなデータには効率的ではない。

• Client strong, Server weak:

– 普通やらないができる。

– flex.messaging.io.amf.ASObject extends HashMap

– データを受け取る際にAS型にget/setを記述します。

60CLASSMETHOD2007/12/21

Page 61: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

Data Management Servicesその他の特徴

• ページング

• オブジェクトの遅延参照

• 前状態に戻す

• オフラインキャッシュ

61CLASSMETHOD2007/12/21

Page 62: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

最後に

• クラスメソッドでは、RIA開発に力を入れています。– RIAプロジェクトを30件以上やっています。

• お仕事の依頼はこちら– http://www.classmethod.jp/

[email protected]

– 業務向け・コンシューマ向けどちらも開発できます。

– RIA事例多数!– RIA事例多数!

• 一緒にお仕事したい方はこちら– http://www.classmethod.jp/

[email protected]

– 全て社内で開発しています。客先常駐型ではありません。

– AIR・Flex・BlazeDSをはじめ様々な新しい技術を経験できます。

62CLASSMETHOD2007/12/21

Page 63: BlazeDS を理解する...2007/12/17  · BlazeDS とは • BlazesDS は、Flex やAIR などキョア゠ヱテからコヺノヺのヅヺソセヺ シに゠キスシする方法を提供するコヺノヺセビテイゥ゠ケヱホヺニ

オープンな発想と高い技術力により、オープンな発想と高い技術力により、オープンな発想と高い技術力により、オープンな発想と高い技術力により、すべての人々の創造活動に貢献し続けます。すべての人々の創造活動に貢献し続けます。すべての人々の創造活動に貢献し続けます。すべての人々の創造活動に貢献し続けます。

2007/12/21 CLASSMETHOD 63