デジタル4Kビデオ. カメラレコーダー - Sony · 準備する 撮る/見る 残す 使いこなす その他 ヘルプガイド(Web取扱説明書) Web上のマニュアル
BlazeDS を理解する...2007/12/17 · BlazeDS とは • BlazesDS は、Flex やAIR...
Transcript of BlazeDS を理解する...2007/12/17 · BlazeDS とは • BlazesDS は、Flex やAIR...
Blaze DS
を理解する
クラスメソッド株式会社
横田聡(よこたさとし)
http://www.classmethod.jp/
1CLASSMETHOD2007/12/21
自己紹介
• まいどsato-shiです。
• http://d.hatena.ne.jp/sato-shi/
• http://www.classmethod.jp/
2007/12/21 CLASSMETHOD 2
アジェンダ
• BlazseDSとは
• リモート通信
• メッセージ配信
• JMS連携
• その他
3CLASSMETHOD2007/12/21
BlazeDSとは
• BlazesDSは、FlexやAIRなどクライアントからサーバーのデータソー
スにアクセスする方法を提供するサーバーソフトウェアコンポーネントです。
• Javaアプリケーションサーバー上のコンテキストとして動作(war)– 主要JavaAPサーバー対応
– Tomcat対応
• 主な機能は以下の3つ• 主な機能は以下の3つ– RPC Service
• リモート通信, ( Httpサービス, Webサービス )
– Message Service
• データプッシュ, JMS連携
4CLASSMETHOD2007/12/21
FlexとBlazeDSの関係
Flexアプリ(アプリ(アプリ(アプリ(Flashアプリ)アプリ)アプリ)アプリ)
RemoteObjectService
MessagingService
WebService
HttpService
ブラウザブラウザブラウザブラウザ
FlashPlayer
JVM
JavaAPサーバーサーバーサーバーサーバー
BlazeDS
MessagingService
5CLASSMETHOD2007/12/21
AIRとBlazeDSの関係
Flexアプリ(アプリ(アプリ(アプリ(Flashアプリ)アプリ)アプリ)アプリ)
RemoteObjectService
WebService
HttpService
MessagingService
AIRラインタイムラインタイムラインタイムラインタイム
FlashPlayer/HTMLエンジンエンジンエンジンエンジン
JVM
JavaAPサーバーサーバーサーバーサーバー
BlazeDS
6CLASSMETHOD2007/12/21
MessagingService
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
BlazeDSと他フレームワークの連係例
• BlazeDSの仕組みのみで全て構築するのでしょうか?→NO
BlazeDS Spring Hibernate
BlazeDS Service Dao
Service
BlazeDS Seasar2 S2Dao
Factoryのののの仕組みを利用仕組みを利用仕組みを利用仕組みを利用
Service
いつもの仕組みと連携可能いつもの仕組みと連携可能いつもの仕組みと連携可能いつもの仕組みと連携可能
POJO
8CLASSMETHOD2007/12/21
リモート通信リモート通信リモート通信リモート通信
ものすごい生産性向上
9CLASSMETHOD2007/12/21
リモート通信
• サーバーサイドJavaのメソッドを直接呼び出すことができ、引数や戻り値の型を自動的にマッピングすることができる。– HTTP上のAMF(ActionScript Message Format)型で通信
• 通信は非同期で行われる。
• 戻り値はイベントハンドラーによって通知される。(ResultEvent)
• 例外はイベントハンドラーによって通知される。(FaultEvent)• (FaultEvent)
ServerClient
Request
ResultEvent /FaultEvent
RemoteObject
AMF通信通信通信通信
Java
10CLASSMETHOD2007/12/21
AMF(ActionScript Message Format)型
• RemoteObject通信を行う際のデータフォーマット
• SOAPやJSONなどのテキストベースではなくバイナリー
• サイズが小さく、他の通信プロトコルより少ない帯域幅を使用– 例) http://www.jamesward.org/blazebench/
• StrongTypeオブジェクトのエンコードをサポート
• FMS(Flash Media Server)などの動画配信でも使われている• FMS(Flash Media Server)などの動画配信でも使われている
11CLASSMETHOD2007/12/21
イベントモデル
リスナーリスナーリスナーリスナーディスパッチャーディスパッチャーディスパッチャーディスパッチャーメッセージメッセージメッセージメッセージ
ハンドラーハンドラーハンドラーハンドラーアクションアクションアクションアクション
イベントイベントイベントイベント
12CLASSMETHOD2007/12/21
RemoteObjectの簡単な例
remoting-
config.xmlRequest
ResultEventDataGrid
RemoteObject
Button
Server
ProductService
Client
ResultEvent
Handler
DataGrid
ProductDao
13CLASSMETHOD2007/12/21
サービスクラス(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
サービスの登録
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
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
Clientの記述
全てのアイテムを取得<mx:Button label="Get All Data"
click="myService.getAllProducts()"/>
引数を指定して取得<mx:Button label="Get Data"
click="myService.getProductById(100)"/>
クリックイベントクリックイベントクリックイベントクリックイベント
17CLASSMETHOD2007/12/21
結果のバインド
イベントハンドラーで指定せずに戻り値で指定するにはserviceid.methodName.lastResult
具体的には<mx:DataGrid
dataProvider="{myService.getAllProducts.lastResult}"/>
18CLASSMETHOD2007/12/21
RemoteObjectのイベントを捕捉する
• result
– サーバーの呼び出しに成功した場合に発生するイベント
– mx.rpc.events.ResultEventのインスタンス
– イベントのresultプロパティに戻り値データが入ってくる
• fault
– サーバーの呼び出しに失敗した場合に発生するイベント
– mx.rpc.events.FaultEventのインスタンス– mx.rpc.events.FaultEventのインスタンス
– イベントのfaultプロパティに例外/エラー情報が入ってくる
19CLASSMETHOD2007/12/21
カスタムイベントハンドラー
カスタムイベントハンドラーの定義[Bindable]
private var products:ArrayCollection;
private function resultHandler(event:ResultEvent):void {
products = event.result as ArrayCollection;
}
イベントリスナーresult=resultHandler(event);
20CLASSMETHOD2007/12/21
複数のメソッドにハンドラー
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
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
メッセージ配信メッセージ配信メッセージ配信メッセージ配信
BlazeDSの基本テクノロジ
23CLASSMETHOD2007/12/21
Flex Message Service
• BlazeDSの基本機能のひとつ
• 複数Client環境下でのClient-Server間メッセージ送受信
• 送信側<mx:Producer> と受信側<mx:Consumer>
• Serverからのメッセージはdestinationを通じて行われる
24CLASSMETHOD2007/12/21
プッシュ配信の仕組み
• BlazeDS
– ポーリング型(Comet)
– ステートフルセッション型
• LCDS
– RTMP型
2007/12/21 CLASSMETHOD 25
HTTPの特徴はステートレスである。の特徴はステートレスである。の特徴はステートレスである。の特徴はステートレスである。(リクエスト&レスポンスで接続状態が切れる)(リクエスト&レスポンスで接続状態が切れる)(リクエスト&レスポンスで接続状態が切れる)(リクエスト&レスポンスで接続状態が切れる)ここでリクエストに対してレスポンスにここでリクエストに対してレスポンスにここでリクエストに対してレスポンスにここでリクエストに対してレスポンスに時間を掛けてプッシュ配信している時間を掛けてプッシュ配信している時間を掛けてプッシュ配信している時間を掛けてプッシュ配信しているように見せかける技術がように見せかける技術がように見せかける技術がように見せかける技術がComet。。。。
この使い方をすると、サーバー側に多大なこの使い方をすると、サーバー側に多大なこの使い方をすると、サーバー側に多大なこの使い方をすると、サーバー側に多大な負荷が掛かるためサーバーを強くするか、負荷が掛かるためサーバーを強くするか、負荷が掛かるためサーバーを強くするか、負荷が掛かるためサーバーを強くするか、利用者を制限するなどの措置が必要。利用者を制限するなどの措置が必要。利用者を制限するなどの措置が必要。利用者を制限するなどの措置が必要。
メッセージの例
messaging-
config.xml
Producer
Consumer
Button
ServerClient
Handler
Button
26CLASSMETHOD2007/12/21
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
ステートフルセッション型ステートフルセッション型ステートフルセッション型ステートフルセッション型
Producerの記述
• ProducerはClientからServerのdestination宛にメッセージを送信します。
• Flexアプリ内にて<mx:Producer>と記述します。
• destination名は設定ファイル内のidを指定します。<mx:Producer id=“producer” destination=“fooDestination"/>
28CLASSMETHOD2007/12/21
メッセージ送信の方法
• 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
Consumerの記述
• ConsumerはServerのdestinationからClientに送られるメッセージを受信します。
• Flexアプリ内にて<mx:Consumer>と記述します。
• destination名は設定ファイル内のidを指定します
<mx:Consumer id=“consumer” destination=“fooDestination"/>
• Subscribeメソッドによってメッセージの受信を開始します。• Subscribeメソッドによってメッセージの受信を開始します。
consumer.subscribe();
30CLASSMETHOD2007/12/21
メッセージの受信
• メッセージが受信されると、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
特定Clientグループへのメッセージ送信
Group1
Group1
Group2
Server
Client
32CLASSMETHOD2007/12/21
Subtopic
• サブトピック機能を利用すると、Producerコンポーネントが宛先に
送信するメッセージを特定のカテゴリまたはサブトピックに分配することができます。また、宛先にサブスクライブするConsumerコン
ポーネントが、特定のサブトピックまたは一連のサブトピックに送られたメッセージだけを受信するようにも設定できます。複数のサブトピックのメッセージを送受信するにはワイルドカード文字(*)を使用します。使用します。
33CLASSMETHOD2007/12/21
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
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
Selector
• JMSの宛先においてサブトピックを使用することはできませんが、JMSを使用する場合は代わりにメッセージのヘッダとConsumerセレクタ式を利用することで、同様の機能が実現できます。– デフォルト指定
– Java経由でメッセージを受信する
• MessageBroker
• AsyncMessage• AsyncMessage
– JMS経由でメッセージを受信する
36CLASSMETHOD2007/12/21
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
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
SelectorはSQL92形式
• Selectorの書き方– SQL文形式
– 一致するメッセージのみ購読する
– メッセージのヘッダ情報から条件指定
– 指定時にサーバに
"*" ...
"/" ...
"+" ...
"-" ...
"not" "like" ...
"not" "in" ...
"not" "between" ...
"=" ...– 指定時にサーバに購読条件が指定される
– 条件外のメッセージは配信されない
"=" ...
"<>" ...
">" ...
">=" ...
"<" ...
"<=" ...
39CLASSMETHOD2007/12/21
JMS連携連携連携連携
Java標準メッセージ仕様と連携する
40CLASSMETHOD2007/12/21
Httpの世界
• 接続を維持しないステートレスなプロトコル
• リクエスト無しにデータを取得するのは難しい
リクエストリクエストリクエストリクエスト
レスポンスレスポンスレスポンスレスポンス
41CLASSMETHOD2007/12/21
JMS(Java Messaging Service)
• MOM (メッセージ指向ミドルウェア )にアクセスするための標準API
• Publish / Subscribe メッセージモデル
コンシューマコンシューマコンシューマコンシューマ
メッセージプロデューサメッセージプロデューサメッセージプロデューサメッセージプロデューサトピックトピックトピックトピック
コンシューマコンシューマコンシューマコンシューマメッセージメッセージメッセージメッセージ メッセージメッセージメッセージメッセージ
コンシューマコンシューマコンシューマコンシューマ
コンシューマコンシューマコンシューマコンシューマ
コンシューマコンシューマコンシューマコンシューマ
メッセージコンシューマメッセージコンシューマメッセージコンシューマメッセージコンシューマ
(トピックサブスクライバ)(トピックサブスクライバ)(トピックサブスクライバ)(トピックサブスクライバ)
42CLASSMETHOD2007/12/21
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
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
その他その他その他その他
いろいろ
45CLASSMETHOD2007/12/21
設定ファイルを書きたくない!
• ランタイム設定ができます。– 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
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
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
BlazeDSでクラスタリング
• JGroupsを使ってできます。
• JGroupsとは、TCP/UDP/JMSなどを使ったマルチキャストを実現するオープンソースライブラリ
• JBossとかでも使われているみたい。
2007/12/21 CLASSMETHOD 49
BlazeDSでWSRP
• WSRP(Web Services for Remote Portlets )と連携。
• WSRP内にBlazeDSのポートレット表示ができる。
2007/12/21 CLASSMETHOD 50
BlazeDSでQoS
• サーバーとクライアントでキューイングしている。
• クライアントごとに配信するデータをまとめることができる。
2007/12/21 CLASSMETHOD 51
BlazeDSにはにはにはには無くて、無くて、無くて、無くて、LCDSにある機能。にある機能。にある機能。にある機能。
データ管理データ管理データ管理データ管理
データの衝突を回避しながら同期をとる
52CLASSMETHOD2007/12/21
Data Managementの機能
• Client-Server間及びServer-DB間のデータ管理– 自動リフレッシュによる反映
– マニュアルリフレッシュによる反映
通知通知通知通知
更新更新更新更新 同期同期同期同期
通知通知通知通知
Client
Server DB
53CLASSMETHOD2007/12/21
データ同期の仕方
• Adapter
– ASObjectAdapter:おまかせ(デフォルト動作)
– JavaAdapter:Javaで指定
• Assembler
– 自作Assembler:
» AbstractAssemblerを継承して作成
• Fill、getItem、createItem、updateItem、deleteItemを記述– SQLAssembler
» SQL文で指定
– HibernateAssembler
» Hibernateにおまかせ
自作自作自作自作Assembler
自作自作自作自作Service
自作自作自作自作Dao
54CLASSMETHOD2007/12/21
トランザクション autoCommit = true
• 管理対象のデータ変更イベントで即時更新
data-management-config.xml
<destination id="notes">
<adapter ref="actionscript"/>
<properties>
<metadata><metadata>
<identity property="noteId"/>
</metadata>
</properties>
</destination>
55CLASSMETHOD2007/12/21
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
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
トランザクション autoCommit = false
• クライアントに変更のキューが蓄積される。
• 可能であれば新しい変更と古い変更をマージする。
• use-transactions=true でコミット
– トランザクション開始
– createItem, updateItem, deleteItem メソッドの呼び出し
– コミット/ロールバック
• use-transactions=falseでコミット
– createItem, updateItem, deleteItem メソッドの呼び出し
– 最初のエラーで停止
• どれも成功したら表示をリフレッシュする
• 変更の成功を他のClientに通知する
58CLASSMETHOD2007/12/21
Data Managementのアーキテクチャー
59CLASSMETHOD2007/12/21
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
Data Management Servicesその他の特徴
• ページング
• オブジェクトの遅延参照
• 前状態に戻す
• オフラインキャッシュ
61CLASSMETHOD2007/12/21
最後に
• クラスメソッドでは、RIA開発に力を入れています。– RIAプロジェクトを30件以上やっています。
• お仕事の依頼はこちら– http://www.classmethod.jp/
– 業務向け・コンシューマ向けどちらも開発できます。
– RIA事例多数!– RIA事例多数!
• 一緒にお仕事したい方はこちら– http://www.classmethod.jp/
– 全て社内で開発しています。客先常駐型ではありません。
– AIR・Flex・BlazeDSをはじめ様々な新しい技術を経験できます。
62CLASSMETHOD2007/12/21
オープンな発想と高い技術力により、オープンな発想と高い技術力により、オープンな発想と高い技術力により、オープンな発想と高い技術力により、すべての人々の創造活動に貢献し続けます。すべての人々の創造活動に貢献し続けます。すべての人々の創造活動に貢献し続けます。すべての人々の創造活動に貢献し続けます。
2007/12/21 CLASSMETHOD 63