では、Spring BlazeDS Integrationを利用して、FlashからSpring管理下のビーンを呼び出してみる。開発に利用したバージョンは次の通りだ。

  • Spring 2.5.6
  • Spring BlazeDS Integration 1.0.3
  • BlazeDS 3.2
  • Flex Builder 3/AS3

なお、本企画は概説ということなので、以下では重要な部分のみ説明する。詳細についてはこちらからプロジェクトフォルダをダウンロードしてコードを確認してほしい。Eclipse + Maven2の環境で動作する。

実装のポイント

まず、機能全体を見てみよう。このアプリケーションは簡易的なチャットアプリケーションで、1.メッセージの入力しサーバに送信する、2.サーバで管理された全メッセージを取得する、という機能を提供する。

図1: クライアントアプリケーションのスナップショット

最初に、Flex側でサーバサイドのリモートオブジェクトを定義する。

simplemessage.mxmlの抜粋

<mx:RemoteObject id="srv" destination="simplemessage">
<mx:method name="findAll" result="doFindAll(event)" />
<mx:method name="addMessage" result="doAddMessage(event)" />
</mx:RemoteObject>

mxmlファイル内の要素は、属性idがリモートオブジェクトの変数名になり、属性destinationに指定された値がリモートオブジェクト名、つまり、Spring管理のビーン名となる。また、要素では属性nameにビーン側のメソッド名、属性resultにFlex側のコールバック関数が記述されている。よってAS内でsrv.addMessage({メッセージオブジェクト});と記述すれば、サーバ側のビーンに定義されたメソッドaddMessageが透過的に呼び出される。なお、この場合のメッセージオブジェクトはAS内でもJava内でも同じ型で定義されている。

次にサーバ側の定義を行う。まず、サーブレットはBlazeDSが提供するMessageBrokerServletではなく、SpringのDispatcherServletに変更する。

web.xml抜粋

<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>

次にSpring側の定義は、次のようになる。

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:flex="http://www.springframework.org/schema/flex"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                        http://www.springframework.org/schema/flex http://www.springframework.org/schema/flex/spring-flex-1.0.xsd"
    default-lazy-init="false">

    <flex:message-broker/>

    <bean id="simplemessage" class="jp.co.gxp.sample.blazeds.simple.SimpleMessageServiceImpl">
        <flex:remoting-destination />
    </bean>
</beans>

Spring BlazeDS Integrationでは名前空間flexが提供されているため、要素を記述するだけで基本的な設定は自動的に行われる。あとはリモートオブジェクト対象の要素の内側に要素を記述するだけだ。これだけでFlexから透過的にSpringのビーンを呼び出すことができる。

採用には十分な検討も必要

このように便利なSpring BlazeDS Integrationだが、実案件への適用に当たっては懸念もある。Flash関連の技術は、過去から仕様が短期間にころころ変わるという問題があり、企業システムへの採用については運用保守性などの観点から十分に検討することをお勧めする。具体的にはAS3からAS4のジャンプは気になるところだ。また、製品サポートが一般的に企業システムで要求される期間に比べて短く設定されることが多い。さらに昨今ではHTML5の広がりに合わせてFlash不要論まで飛び出しており、RIA関連の動向は予断を許さない。

とはいえ、こうした問題を勘案しても現在のRIA開発であればFlexやAIRが第一候補になるだろう。さらにSpring BlazeDS Integrationを利用すれば既存のSpring資産が活用できる。

サンプルコード: springblazeds.zip

執筆者紹介

鈴木 雄介(SUZUKI Yusuke) - グロースエクスパートナーズ
ビジネスプラットフォーム事業ゼネラルマネージャー/チーフアーキテクト


企業システムのアーキテクチャ設計、開発コンサルティング、自社サービス開発に従事するエンジニア。

共著書に『拡張する空間 建築家とITアーキテクトがつくるもの』(発行: コム・ブレイン)、監修書に『ソフトウェアアーキテクトが知るべき97のこと』(発行: オライリージャパン)などがある。

ブログはアークランプ。ツィッターはhttp://twitter.com/yusuke_arclamp