この記事ではJavaプログラマがなぜFlexとBlazeDSを学ぶべきなのかについて13の理由を述べています。なぜ高度にインタラクティブなWebサイトからJavaで開発されたバックエンドをもつエンタープライズ・アプリケーションまでを含む、リッチ・インターネット・アプリケーション(RIA)の開発にFlexとBlazeDSの組み合わせが最適な選択肢となるのかについて述べています。一番重要なのは、この組み合わせが開発者と企業の双方にとって高い投資回収率(ROI)が見込めるということを示している点です。
JavaプログラマがBlazeDSを学習すべきである13の理由を述べるにあたって、架空の炭酸飲料のディスペンサを使って既存のJavaプログラムをRIAに変換する方法を示しています。例を通して、既存のJavaアプリケーションからBlazeDSを使う方法と新しいJavaアプリケーションからBlazeDSを使う方法という異なる方法について説明しています。
理由その1:オープン・ソースである
中心となるFlexのソフトウェア開発キット(SDK)はオープン・ソースのフレームワークで、異なるブラウザやオペレーティング・システム上で同じ見た目となるRIAを構築したり保守したりするのに使われます。FlexはMozilla Public Licenseで公開されています。コンパイルされたFlexアプリケーションはプロプライエタリなAdobe Flashプラットフォーム上で稼働します。
FlexをJavaと接続するのに使うBlazeDSはリモート通信、メッセージ送信のためのオープン・ソース技術です。Javaアプリケーション・サーバ上でサーブレットとして稼働しますので、あらゆる標準的なJavaのWebアプリケーションと共に使うことが出来ます。BlazeDSはLesser GNU Public License(LGPL)で公開されています。BlazeDSのリリースと合わせ、AdobeはActionScript Message Format(AMF)の仕様も公開しています。この仕様のおかげでBlazeDSとJavaはコンパクトなバイナリ形式を使ってFlexクライアントと通信を行うことが出来るのです。
理由その2:コミュニティの手厚いサポート
Flexにはとても活発なコミュニティとそのコミュニティが支えているプロジェクトがあります。Flex.orgというコミュニティのニュースを伝えるAdobeのサイトではほぼ毎日のようにコミュニティによる寄稿が見られますし、Yahoo!にあるFlexのユーザ・グループには11,000を超える会員がいます。
例えば、Google CodeにあるFlexLibプロジェクトはとても多くのオープン・ソースによるユーザ・インタフェース(UI)コンポーネントを提供しています。SwizプロジェクトとMateプロジェクトはイベントを扱うためのフレームワークを提供しています。そしてGorilla LogicはUIの自動テストのためにFlex Monkeyを提供しています。
理由その3:今後6カ月以内に新たな職を見つけることが出来る
AdobeでFlexエバンジェリストを務めるJames Ward氏によると、いまだに優れたFlex開発者に対する強い引き合いがあるとのことです。Flexを学習すれば競争相手を追い越すような市場価値の高いスキルを身につけることが出来ます。
理由その4:より高い経営上のROI
一般的に、エンタープライズ向けWebアプリケーションの開発は明らかに難しくなってきています。FlexとBlazeDSは強力なツールを提供するだけではなく、開発をより簡単にします。開発者の生産性が向上すれば組織が市場へ展開するのが速くなります。FlexとFlashはより魅力的なユーザ・エクスペリエンスを生み出しますので、(サイトの)トラフィックやコンバージョン・レイトを増加させることになります。
この点で理想的な例がBordersの書籍販売チェーンです。Bordersは最近“Magic Shelf(魔法の本棚)”を使って新しいWebサイトを立ち上げました。このサイトでは本をめくる経験を疑似体験するためにFlashインタフェースを採用しています。Bordersはこれによってコンバージョン・レイトが大きく増加したことに気が付きました。“サイトの訪問者が本、DVD、そしてCDのカバーを見ることが出来るFlash式のインタフェースを使ったユーザの購入率はは、そうでないインタフェースを使ったユーザに対して約62%も高い”のです。
理由その5:FlexはUIを作るために設計された最初の(開発)言語である
多くの言語は後付けでUIの構築をサポートするようになりました。とりわけJavaのSwingがそうです。結果として、データを書き込むような単純な処理をSwingで行うのは苦痛であり、Swing独自のデータ・モデルが必要となってしまいました。Swingの最大の問題点は生産性を向上させるためにはアプリケーション・プログラミング・インタフェース(API)に精通していなければならないということです。
Flexはまさに正反対です。Flexは当初よりUIの構築のために設計されています。Bruce Eckel氏が述べたように、Flexは初めてのUI開発向けドメイン固有言語(DSL)なのです。従って、JavaServer Pages(JSP)、JavaServer Faces(JSF)、そしてSwingといった他の技術と比べてFlexでUIを開発するのは簡単なのです。データ・バインディング、イベントのハンドリング、コンポーネントのレイアウトといったUI開発のための一般的な技術が言語に組み込まれているので、言語についてはあまり詳しくなくても生産性を上げることが出来るのです。
理由その6:Javaと似たプログラミング・モデルである
Javaの開発で慣れ親しんだ既存のツールを使って開発することが出来ます。さらにSDKに含まれる無料のコマンドライン・ツールを使ったり、(Eclipseプラグインである)Adobe Flex Builderを使ったり、最も新しいところではIntelliJ IDEA 8を使ってFlexアプリケーションを開発することも出来ます。
Flexはクライアントからデータが読み込まれる形式のステートフルな環境を提供します。このプログラミング・モデルはHypertext Markup Language(HTML)のプログラミングというよりはデスクトップ・クライアントの開発に近いものがありますので、JavaでSwingプログラミングを経験したことがある人なら誰でも馴染みのあるプログラミング・モデルでしょう。
FlexではExtensible Markup Language(XML)に似たUI用のマークアップ言語であるMXMLと、オブジェクト指向のスクリプト言語であるAdobe ActionScriptを使ってプログラミングします。この組み合わせによってFlexのプログラミングはJavaに近いものになります。なぜなら馴染み深いオブジェクト指向の考え方を使うことが出来るからです。
理想的な開発環境の整え方はWebデプロイ用のディレクトリにFlexアプリケーションを構築する方法です。こうすると、ビルドのたびにアプリケーションを再デプロイする必要がなくなるからです。単にブラウザで更新するだけで最新の変更が反映されます。結果としてFlexとBlazeDSを使った開発はかなりの採算性を得ることが出来るようになります。
理由その7:BlazeDSはどのJavaアプリケーション・サーバ上でも稼働する
BlazeDSには複数のバージョンがあり、中にはBlazeDS用の設定がなされたApache Tomcatを含む完成系のバージョンもあります。この記事ではWebアーカイブ(WAR)形式で配布されているバイナリ・ディストリビーションを使います。これによってどのアプリケーション・サーバにもデプロイ可能であることを示します。または解凍して取り出したJavaアーカイブ(JAR)ファイルをプロジェクトで使う方法もあります。BlazeDSのインストール方法に関するオプションについてはBlazeDSのWikiを確認してください。
この例では既存のプロジェクト― 単純な炭酸飲料のディスペンサに対してBlazeDSを適用しています。既存のプロジェクトにJARファイルを追加するだけでアプリケーションからBlazeDSを使えるようになるので、アプリケーションをデプロイ出来るところであればどこにでもデプロイすることが出来るのです。
既存のプロジェクトにBlazeDSを追加するには以下の手順に従ってください。
- BlazeDSのWARファイルに含まれるコンテンツを解凍する:jar xvf blazeds.war
- (解凍された)JARファイルを既存のプロジェクトのlibディレクトリにコピーする:cp -R WEB-INF/lib /sodaSample
理由その8:既存のJavaアプリケーションと共に利用することが出来る
仮に炭酸飲料の例で、既存の炭酸飲料サービスを公開しリモートにあるFlexアプリケーションから接続できるようにしたいとします。既存のアプリケーションに対してBlazeDSを適用するための設定手順は以下のようになります。
- WEB-INF/flexディレクトリにあるBlazeDSの設定ファイルを編集する。
- アプリケーションのweb.xmlに
MessageBrokerServlet
とセッション・リスナの定義をする。
BlazeDSの設定が完了したら、炭酸飲料サービスをBlazeDSのリモート通信用の設定ファイルに追加する必要があります。これによってFlexクライアントから炭酸飲料サービスを呼び出すことが出来るようになります。一つの宛先(destination)とデータを転送するための一つ以上のチャンネル(channel)の定義を追加すればいいのです。基本的なAMF Channelはservices.xmlファイルに定義されています。これを使ってremoting-config.xmlにあるdestinationを識別するようにしましょう。
リモート通信用の設定ファイル上でエンドポイントを定義することで、Flexクライアントから任意の標準的なJavaのサービスを呼び出せるようになります。
Javaのデータ・モデルをFlexクライアントに渡すためには、FlexとJavaの間のマッピングをActionScriptのクラス内に定義します。
[Bindable] [RemoteClass(alias="com.gorillalogic.sodaSample.SodaModel")]
このコードはリモート・サービス呼び出しの結果、JavaのSodaModelが帰ってきた場合にそれをFlexのSodaModel
にマッピングするようにFlexに伝えています。サンプルにあるFlexクライアントではどのようにこのJavaサービスを呼び出すのか示されています。呼び出しの結果、あなたの注文通りのSodaModel
が返されます。
public function callSodaService():void { var sodaType:String = type.text; var sodaCount:int = parseInt(cnt.text); var flag:Boolean = preOpen.selected; remoteObject.getSoda(sodaType, sodaCount, flag); } private function resultHandler(event:ResultEvent):void { var sodaModel:SodaModel = event.result as SodaModel; }
Flexは結果を汎用的なresult
という変数で戻すますが、それをSodaModel
にマッピングしているのです。ここでは詳しく述べませんが、一つのヒントは以下のように、コンパイラの設定の際にservices-config.xmlを特定することです。
-locale en_US -services=/nsource/sodaSample/web/WEB-INF/flex/services-config.xml -context-root /
そうしなければFlexクライアントはJavaサービスを見つけ出すことが出来ません。同様に、クライアント側からサーバ側にオブジェクトを送ることも出来ます。例えば、空のSodaModelをクライアントに戻すことが出来るのです。
理由その9:BlazeDSを拡張するのにJavaを使って変更することが出来る
仮に炭酸飲料サービスが呼び出されるたびにログ出力をする機能を追加したくなったとします。この場合、標準のJavaアダプタを拡張してログ出力機能を追加することが出来ます。
まず初めにJavaAdapter
を継承したJavaのクラスを作成します。
import flex.messaging.services.remoting.adapters.JavaAdapter. public class TimingJavaAdapter extends JavaAdapter {
続いて、invoke()メソッドをオーバーロードします。
public Object invoke(Message message) { RemotingMessage remotingMessage = (RemotingMessage) message; String operation = remotingMessage.getOperation(); String destination = remotingMessage.getDestination(); Logger.info("calling " + operation + " on destination " + destination); Object data = super.invoke(message); return data; }
このメソッドでは実行させたい操作とその宛先を知ることが出来ます。同様にこのシンプルなフック機構は他のことに応用することも出来ます。例えば、サーバへの呼び出しに掛かる時間を計測するのに使うことも出来ます。
理由その10:HTMLやJSPからBlazeDSを呼び出すことが出来る
この呼び出しは、Browser Managerを使う方法とflashVars
を使う方法のようにいくつかの方法で行うことが出来ます。flashVars
はHTMLページ内で設定し、Flexアプリケーション側でその値を読み込みます。
例えば、ユーザ名と注文したい炭酸飲料の種類をHTMLページから送りたいとします。この場合、以下のようにHTMLページ内でflashVars
をセットします。
そして、Flexアプリケーション側で以下のようにこれらの値をアプリケーション(application)のパラメータ(parameter)として読み取ることが出来ます。
var username:String; if (Application.application.parameters.hasOwnProperty("username")) { username = Application.application.parameters.username; }
理由その11:FlexとBlazeDSのデータ転送効率は他のAjaxを使った方法よりも優れている
デフォルトでは、全てのリモート・プロシージャ呼び出し(RPC)はAMFのバイナリ・プロトコルを使うようになっています。オープン・スタンダードであるAMFは極めて速いのです。James Ward氏は他のリモート技術との比較を示した例を提示しています。非同期JavaScriptとXML(AJAX)を使ったDojoのような方法では数百件のデータで苦戦していますが、FlexとBlazeDSの組み合わせでは数千のデータでも簡単に処理することが出来ます。(異なるRIA技術を使ったデータ読み込みのベンチマークに関するJames Ward氏の調査結果を確認されたい)
理由その12:Javaクライアントから直接BlazeDSを呼び出すことが出来る
BlazeDSの最新のリリースにはJavaクライアントからBlazeDSサーバを呼び出すことを可能にするJava AMFクラスが含まれています。このようにBlazeDSを呼び出すことが可能になるとユニット・テストやロードのテストにとても役立つでしょう。
理由その13:Springと合わせて使うことが出来る
AdobeとSpringは両者のプロジェクト間の統合をより進めるための協業を始め、Spring-BlazeDS統合の初期リリースでは多くのことが約束されています。Springが管理するBeanをリモート・サービス化することで、重複する設定ファイルを削減することが出来ます。詳細についてはプロジェクトのホームページを参照されたい。
結論
BlazeDSがオープン・ソースであり、Javaをベースにしているので、Javaによる新しいサーバ・プロジェクトや既存のサーバ・プロジェクトにとって理想的な選択肢となります。また、高性能のリモート通信とFlex/Java間のオブジェクト・マッピング機能によりFlexとBlazeDSの組み合わせはRIA開発の理想的な選択肢となります。Flex/BlazeDSの初心者であるJava開発者はこれらを使った開発の生産性の高さと学習の容易さに気が付くでしょう。
さらにFlexとBlazeDSの組み合わせは大規模Javaエンタープライズ・アプリケーションにとっても理想的な選択肢です。(私が携わった)以前のプロジェクトで私のチームは50種類以上の異なる画面と数千件に及ぶサーバ・クライアント間のデータ通信が発生するアプリケーションを開発しました。この類のアプリケーションを旧来のAjax技術で実装することはほぼ不可能です。FlexとBlazeDSを使ったことで私達は1年足らずの期間で最初のリリースをすることが出来ました。この動的な製品の組み合わせがあなたのアプリケーション開発プロジェクトにどれだけ貢献できるか想像してみて下さい。
注意:これらの技術に関する基礎的な知識が必要です。"Building Web and Desktop Applications with BlazeDS and AMF"や"BlazeDS 30-minute test drive"を含むいくつかのBlazeDSの入門書が手に入ります。