2008-01-10

An alternative of BlazeDS - Rails and WebORB

Railsに WebORBをプラグインすると、Flexの mx:RemoteObject から呼び出し可能なサービスを Rubyで記述することが出来る。

基本的な構図



Flex(クライアントアプリケーション)側は、通信クライアントとなるオブジェクトとして mx:RemoteObject を使用する。

Rails側は、WebORBをプラグインすることによって生成されたコントローラ weborb を通信のエンドポイントとし、クライアントからの呼び出しを受け付ける。このweborbコントローラが、呼び出し対象となるサービスへFlexアプリケーションからのリクエストをディスパッチする。ここでいうサービスとは、app/services に配置された Rubyオブジェクト。

Rails側


コマンドは LinuxなりMacなりでの例。Windowsは知らん。
特に MacOS X 10.5の場合は RubyもRailsも最初から入っているので迷うことはまずないだろう。

# Railsアプリケーションを生成
rails myrailsapp

# WebORBをプラグイン
cd myrailsapp
./script/plugin install http://themidnightcoders.net:8089/svn/weborb

# サービス(リモートオブジェクト)となるクラスを作成する
# app/services/ に クラス名と同じ名前の .rbファイルを配置することで
# WebORBのディスパッチ対象となる
vi app/services/MyService.rb

〜内容〜
class MyService
def say_hello
# ここではもちろん ActiveRecordも使える
# HTTP Cookieによるセッションにアクセスする必要がある場合は
# RequestContext.get_session
# を使うことが出来る

"Hello, World!"
end
end
# Railsを起動(ポート3000番でHTTPの待ち受けになる)
./script/server &

Flex側

<mx:RemoteObject id="srv" destination="MyService"
endpoint=
"http://localhost:3000/weborb/"/>
<mx:TextInput text="{srv.say_hello.lastResult}"/>
<mx:Button label="Say Hello" click="srv.say_hello()"/>


たやすい事この上ない。

WebORBと似たようなことが出来るものとして RubyAMFもある。こちらは Railsのコントローラに :amf というレンダラを提供するもので、WebORBと比べるとより Railsのアプリケーション作法に則ったものだが、個人的には WebORBのほうが気に入っている。ただし実行速度は RubyAMFの方が良いらしい(手元では未確認)。

メモ

Flexの通信は全て非同期オペレーションである。上の例では srv.say_hello() でリモートの say_helloメソッドをコールしているが、srv.say_hello()の戻り値は "Hello, World!" にはならない。メソッド呼び出しはバックグラウンドで処理され、サーバから結果が返り次第 srv.say_hello.lastResult にセットされるのである(上の例では mx:TextInputからそれを参照している)。

メソッド呼び出し結果の着信をトリガにして何らかの処理を行いたい場合は、イベントリスナの登録によって行うか mx:RemoteObjectの中に mx:method要素を明示的に定義し、result属性にイベント処理の内容を記述することになる。

昔からのプログラマは非同期通信に慣れているだろうが、Webから入門した新しいプログラマは Ajaxのために XHRをいじり倒した経験があるのでもない限り馴染みが薄く戸惑うかもしれない。だが Flexでは同期通信が出来ない。信じがたいかもしれないがこれは本当だ。Adobeのフォーラムか何かでこんなやりとりを見かける。

「同期通信をしたいんだけど、どうしたらいい?」
「同期のことは忘れようよ」

ラベル: ,

0 件のコメント:

コメントを投稿

<< ホーム