GAE/JにBlazeDSを組み込む
さて筆者が「ご都合.com」の実装に際して最初に考えたことは、「GAE/Jの上でBlazeDSは動くのかな?」ということです。GAE/Jでは通常のサーブレットやJSPが動作しますので、Flexクライアントとサーバ間でXMLやJSON形式でデータをやりとりすることは難しくありません。とはいえ、使ったことのある方ならおわかりのとおり、FlexのRemoteObjectによるAMF通信のお手軽さは、一度経験するとやみつきになります(人間、どんどんラクな方へと堕落してしまうものです...)。
JavaベースのWebアプリとの間でRemoteObjectを用いるもっとも簡単かつ低コスト(無償)な方法は、Adobeが提供するBlazeDSを利用することです。そこでまずは、BlazeDSの「blazeds.war」に含まれるライブラリファイル(JARファイル)や設定ファイルを、GAE/Jで作成したプロジェクトの「WEB-INFフォルダ」にコピーしました。
つづいて、BlazeDSの通常通りのリモーティング設定を行います。設定ファイルである「remoting-config.xml」にてデスティネーションを設定したのち、サーバ側JavaクラスにてHello World的メソッドを作成しておきます。ご都合.comでは、サーバ側の「Main」クラスに接続するデスティネーション「Main」を以下のように定義しました。
class="flex.messaging.services.RemotingService"> (中略) <destination id="Main"> <properties> <source>jp.co.sth.gotsugo.server.Main</source> </properties> </destination> </service>
さらに、Flexクライアントからのリクエストを受け付けるBlazeDSのMessageBrokerServletをweb.xmlにて登録しておきます。
<!-- MessageBroker Servlet --> <servlet> <servlet-name>MessageBrokerServlet</servlet-name> <display-name>MessageBrokerServlet</display-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>
一方、Flex側でも同デスティネーションに接続するためのservices-config.xmlを以下のように記述します。
<services-config> <services> <service id="remoting-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage"> <destination id="Main"> <channels> <channel ref="ch-blazeds" /> </channels> <properties> <source>*</source> </properties> </destination> </service> </services> <channels> <channel-definition id="ch-blazeds" class="mx.messaging.channels.AMFChannel"> <endpoint url="http://ホスト名/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> </channels> </services-config>
また、Flexクライアントのプロジェクトプロパティの「Flexコンパイラ」設定画面にて、「追加コンパイラ引数」として以下のように記述し、上記services-config.xmlを参照するようにします。
-services "services-config.xml"
そしてFlexクライアントでは、RemoteObjectから上記の「Main」デスティネーションを呼び出すコードを記述します。
// 初期化 mainService = new RemoteObject("Main"); mainService.addEventListener(ResultEvent.RESULT, onResult); mainService.addEventListener(FaultEvent.FAULT, onFault); ... // メソッド呼び出し var token:AsyncToken = mainService.getOperation("sayHello").send({msg: "hello");
以上で準備は完了です。ここまでの手順は、BlazeDSの通常の設定作業であり、特別なことはなにもしていません。
GAE/JプラグインにはローカルのEclipse上でコードをテストできるデバッガ機能がありますので、それを用いてローカル環境でテストサーバを起動します。つづいてFlexクライアントから上記のメソッド呼び出しを実行し、テストサーバへリモート呼び出しを実行します。これは問題なく動作させることができました。
しかし、実のところ「落とし穴」はこの後に(たくさん)待っていました。その詳細と回避方法については、次回に紹介したいと思います。