Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Google App Engine for Java + BlazeDSでハマらない方法
~Flex/AIRハマり帳(前編)~

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/11/25 14:00

目次

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.war内の各ファイルをコピーしたところ
図:blazeds.war内の各ファイルをコピーしたところ

 つづいて、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クライアントから上記のメソッド呼び出しを実行し、テストサーバへリモート呼び出しを実行します。これは問題なく動作させることができました。

 しかし、実のところ「落とし穴」はこの後に(たくさん)待っていました。その詳細と回避方法については、次回に紹介したいと思います。

「FlexではじめるRIA開発」特集、絶賛公開中!


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • スティルハウス 吉川和巳(ヨシカワカズミ)

    テクニカルライター。 Adobe FlexおよびAIRなどのリッチ・インターネット・アプリケーション分野をはじめ、Javaサーバサイド・プログラミング、データベース開発、仮想化技術などを中心に執筆活動を行っている。また技術文書や書籍の翻訳も手がけており、翻訳書に「XML構築ガイド」(ピアソンエデュ...

バックナンバー

連載:Adobe Developer Connection

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5