Adobe BlazeDSを自分のWebアプリケーションに組み込む設定
ActionScriptのオブジェクトをシリアライズするためのバイナリフォーマットを AMFという。BlazeDSは、AMFとJavaオブジェクトのネットワーク透過な変換レイヤを提供するオープンソースのミドルウェアで、2007年12月にAdobeによってベータ版が公開された。
それまでにもリバースエンジニアリングにより同様の機能を持ったミドルウェアがオープンソースでいくつか開発されているが、Adobe自身が公開に踏み切ったことには大きな意味があるといえるだろう。
なお商用版として AdobeはLCDS(旧名FDS)というミドルウェアを販売している。
BlazeDSで何が出来るのかを平たく説明すると、Flash(正しくはFlex)アプリケーションから、サーバ上にある Java Beanのメソッドを HTTP経由で呼び出すことが出来るのである。EJBクライアントがステートレスセッションBeanのメソッドをネットワーク越しにコールするのに似ているが、当然EJBほど複雑な手続きは要らないし(最近はそうでもないか?)、HTTPベースなので通信環境を選ばない。もちろんリモートの JavaBeansは POJOだ。
さて、BlazeDSに限らず互換プロダクトでもその傾向があるのだが、何もかも含めた全部入りのアーカイブで配布されており、バンドルされている Tomcatをスタートすれば 8080番ポートでサンプルアプリケーションがすぐに動作する、という定番に従っている(Railsが流行ってからというもの、各所でフルスタックごっこが盛んなようである)。動作を試してみたいだけならこれはこれで良いのだが、「既存のWebアプリケーションを一部 RIA化するために BlazeDSをアドオンとして組み込みたい」といった現実的な用途が目前にある向きには、全部入りアーカイブの中のどれとどれが本当に必要なものなのかわかりにくく悩んでしまう。
というわけで、まずはシンプルな JavaBeans呼び出しをするだけに目的を絞って BlazeDSのミニマムスタートアップに必要なモジュールや設定を調べてみた。
注:私が実験した限りだと、Flex SDK 3 の最新ベータ版(Beta3) でないとリモートメソッド呼び出しが常に失敗した。常に最新版を利用されたし。

Flex(クライアントアプリケーション)側は、通信クライアントとなるオブジェクトとして mx:RemoteObject を使用する。
Webアプリケーション側は、通信のエンドポイントとなるサーブレット MessageBrokerServlet を用意する。このサーブレットが、呼び出し対象となるJavaBeansへメッセージをディスパッチする。
WEB-INF/lib に、これらの jarファイルを追加する。
backport-util-concurrent.jar
flex-messaging-common.jar
flex-messaging-core.jar
flex-messaging-remoting.jar
設定ファイルは web.xmlに書いた通りのものを作成する。一般的に、 WEB-INF/flex/services-config.xml とされることが多いようだ。
比較的込み入った設定ファイルだが、ひとまず下記のものを destination 要素内のみ自分用に書き換えて使えば良いだろう。
(サーバ側アプリケーションは amftest.war となってアプリケーションサーバにデプロイされているものとする)

ここまでで、ブラウザ上で動作している Flashアプリケーションからサーバ上の Javaオブジェクトに対しメソッド呼び出しを行い、結果を表示することが出来た。
巷の入門記事などには、サーバ側・クライアント側ともに設定ファイルをやたらとゴチャゴチャ書かなければいけないように書いてあるが、最低限の機能を使うだけなら実はこの程度で済むのであって、込み入ったことをしたくなったらそれはその時に考えれば良いのである。
後で、SpringとBlazeDSを 一緒に使う方法も調べてみようと思う。
それまでにもリバースエンジニアリングにより同様の機能を持ったミドルウェアがオープンソースでいくつか開発されているが、Adobe自身が公開に踏み切ったことには大きな意味があるといえるだろう。
なお商用版として AdobeはLCDS(旧名FDS)というミドルウェアを販売している。
BlazeDSで何が出来るのかを平たく説明すると、Flash(正しくはFlex)アプリケーションから、サーバ上にある Java Beanのメソッドを HTTP経由で呼び出すことが出来るのである。EJBクライアントがステートレスセッションBeanのメソッドをネットワーク越しにコールするのに似ているが、当然EJBほど複雑な手続きは要らないし(最近はそうでもないか?)、HTTPベースなので通信環境を選ばない。もちろんリモートの JavaBeansは POJOだ。
さて、BlazeDSに限らず互換プロダクトでもその傾向があるのだが、何もかも含めた全部入りのアーカイブで配布されており、バンドルされている Tomcatをスタートすれば 8080番ポートでサンプルアプリケーションがすぐに動作する、という定番に従っている(Railsが流行ってからというもの、各所でフルスタックごっこが盛んなようである)。動作を試してみたいだけならこれはこれで良いのだが、「既存のWebアプリケーションを一部 RIA化するために BlazeDSをアドオンとして組み込みたい」といった現実的な用途が目前にある向きには、全部入りアーカイブの中のどれとどれが本当に必要なものなのかわかりにくく悩んでしまう。
というわけで、まずはシンプルな JavaBeans呼び出しをするだけに目的を絞って BlazeDSのミニマムスタートアップに必要なモジュールや設定を調べてみた。
注:私が実験した限りだと、Flex SDK 3 の最新ベータ版(Beta3) でないとリモートメソッド呼び出しが常に失敗した。常に最新版を利用されたし。
基本的な構図

Flex(クライアントアプリケーション)側は、通信クライアントとなるオブジェクトとして mx:RemoteObject を使用する。
Webアプリケーション側は、通信のエンドポイントとなるサーブレット MessageBrokerServlet を用意する。このサーブレットが、呼び出し対象となるJavaBeansへメッセージをディスパッチする。
Webアプリケーションに追加するjarファイル
WEB-INF/lib に、これらの jarファイルを追加する。
backport-util-concurrent.jar
flex-messaging-common.jar
flex-messaging-core.jar
flex-messaging-remoting.jar
WEB-INF/web.xmlにBlazeDS関連の設定を追加する
<listener>
<listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>
<servlet>
<servlet-name>MessageBrokerServlet</servlet-name>
<servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
<init-param>
<param-name>services.configuration.file</param-name>
<param-value>/WEB-INF/flex/services-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MessageBrokerServlet</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
設定ファイルを作成する
設定ファイルは web.xmlに書いた通りのものを作成する。一般的に、 WEB-INF/flex/services-config.xml とされることが多いようだ。
比較的込み入った設定ファイルだが、ひとまず下記のものを destination 要素内のみ自分用に書き換えて使えば良いだろう。
<?xml version="1.0" encoding="UTF-8"?>
<services-config>
<services>
<!-- service要素には何でもいいからIDが要る模様 -->
<service id="remoting-service" class="flex.messaging.services.RemotingService">
<adapters>
<adapter-definition id="java-object"
class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
</adapters>
<default-channels>
<channel ref="my-amf"/>
</default-channels>
<!-- destination要素のIDが mx:RemoteObjectの destination プロパティに対応する -->
<destination id="amftest">
<properties>
<!-- リモート呼び出ししたいJava Beansのクラス名 -->
<source>amftest.AmfTestService</source>
<!-- 注:この Beanはステートレスである -->
</properties>
</destination>
<!-- リモート呼び出しを可能にしたい Beanの数だけ destination要素を記述する -->
</service>
</services>
<channels>
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
<!--
ここで構成されたエンドポイントURLを mx:RemoteObjectの
endpoint プロパティにセットする
{}内は実行時に自動で置き換えられるのでこの記述のままで良い。
-->
<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf"
class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>
</channels>
</services-config>
JavaBeans(呼び出される側)の例
package amftest;
public class AmfTestService {
public String sayHello()
{
return "Hello, World!";
}
}
Flex(呼び出し側)の例
(サーバ側アプリケーションは amftest.war となってアプリケーションサーバにデプロイされているものとする)
<mx:RemoteObject id="srv" destination="amftest"
endpoint="http://localhost:8080/amftest/messagebroker/amf">
<mx:TextInput text="{srv.sayHello.lastResult}"/>
<mx:Button label="Say Hello" click="srv.sayHello()"/>

ここまでで、ブラウザ上で動作している Flashアプリケーションからサーバ上の Javaオブジェクトに対しメソッド呼び出しを行い、結果を表示することが出来た。
巷の入門記事などには、サーバ側・クライアント側ともに設定ファイルをやたらとゴチャゴチャ書かなければいけないように書いてあるが、最低限の機能を使うだけなら実はこの程度で済むのであって、込み入ったことをしたくなったらそれはその時に考えれば良いのである。
後で、SpringとBlazeDSを 一緒に使う方法も調べてみようと思う。
関連記事
- BlazeDSと Springを統合する
- BlazeDSに Spring Frameworkのパワーを与える
- BlazeDSをメッセージブローカにして FlexでPub/Subメッセージングを行う
- RPC以外の通信方法
- An alternative of BlazeDS - Rails and WebORB
- Java + BlazeDSの代わりに Ruby on Rails + WebORB
- More alternative of BlazeDS - PHP and WebORB
- Java + BlazeDSの代わりに PHP + WebORB
ラベル: Flex

0 件のコメント:
コメントを投稿
<< ホーム