Google App Engine/Javaを触ってみた

先日のログで書いたように、RIA型のアプリ、特にMushupアプリケーションやコンポジット・アプリケーションは、アーキテクチャ・モデルとしてのMVC2モデルから乖離していく

これは、同時にサーバーサイドの仕掛けも、大仕掛けのものから、コンポーネント化された簡易なものに変わっていかなくてはならないことを示唆していると思う。
とすれば、「フレームワーク」として捉えていたプロダクトも、旧来のMVC2フレームワークから、コントローラーがクライアント寄りに異動して、(スクリプト言語で記述するように)簡易なものになるだろう。

上であえて「コンポーネント化された」と書いたのは、コンポジット・アプリのような形態を考えた場合、コンポジットする外部APIは、それ自体がコンポーネント化されているためで、これらとシームレスに連携するためには、「お手製」のプログラムもコンポーネント化されていることが望ましいからである。

とはいえ、コンポーネント化という言葉も、POJOからSOAでいうような厳密な「サービスの塊」まで幅広い。
後者の場合、この「塊」をESB(エンタープライズ・サービス・ハブ)でつなぐというのが、SOAの(超簡略化した)概念で、これはJAX-RPCWebサービスを起源にしている(と考える)。

エンタープライズ・レベルでこれを実現することは、非常に骨の折れる仕事になるが、単純なPOJOをベースに「簡単なアーキテクチャ」で設計することは、こういった作業の下準備にもなろうかと思う。

前置きが長くなってしまったが、Google App Engine(GAE)の1つの使いどころとして、こういったシチュエーションが考えられると思う。
Google App Engine/Java(GAE/J)は、Servlet API 2.5に(ほぼ)準拠していると言われているが、その範疇で「何が動くの」と考えれば、POJOであれば、なんの問題もないだろう。

GAE/Jのアプリを、Eclipseで開発する段取りは以下のようになる。

開発環境

インストールが終わって、eclipseを-cleanオプションで起動するとツールバー

が追加される。Window -> preferencesを見ると、「Google」というプラグインが追加されているのを確認できる。

プロジェクトの作成

GAEプラグインをインストールすると、プロジェクト作成をするときに、「web application project」というのが新規に追加されるので、これを選択して、プロジェクトを作成する。

GWTは使わないので、ここではチェックを外した。すると、以下のようなスタブが出来上がる(「GWTを使う」とすると違うスタブができる)。

ここで特徴的なのは、web.xmlとともに、appengine-web.xmlというアプリケーション設定用のファイルと、logging関連の設定ファイルがあること。web.xmlとappengine-web.xmlは以下のようになっている。

web.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
	<servlet>
		<servlet-name>GeaDWRTest</servlet-name>
		<servlet-class>test.GeaDWRTestServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>GeaDWRTest</servlet-name>
		<url-pattern>/geadwrtest</url-pattern>
	</servlet-mapping>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
</web-app>

appengine-web.xml

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
	<application></application>
	<version>1</version>
	
	<!-- Configure java.util.logging -->
	<system-properties>
		<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
	</system-properties>
	
</appengine-web-app>

web.xmlはさほど違和感がないが、appengine-web.xmlには、セッションを利用するか、SSLを利用するか等の設定ができるとのこと。
GAE/Jのアプリケーションサーバーは、Jettyベースと聞く。また、GAEにはHTTPサーバーがない(= コネクタの設定なども当然ない)。サーバーの方言であるとか、HTTPサーバーの構成で設定する内容などをここに設定すると推測。

このスタブを動かすには、プロジェクトを選択して、右クリック「Run as」で「Web Application」を選べばよい。すると、localhost:8080でサーバーが立ち上がるので、ブラウザーでみると以下のようなサンプルが動かせる。

この際、(なぜかは分からないが)「faviconがないよ」というエラーがでる。これは、デプロイしても出るのだが、ひとまずスルー。

デプロイ(配備)

作成したアプリを、GAE/Jにデプロイするには、GAEのアカウントが必要になる。
GAEのトップ画面の右側に、「App Engine アカウントにログインします」というリンクがあって、アカウントを持っている人はここからログイン、持っていない人は、ここからサインアップすることができる。
サインアップの際には、携帯電話のメイルアドレスが必要で、それを入力すると、携帯に認証コードが送られてくる。
これを使って認証をすると、「アプリケーションを作成」となるが、アプリケーション名(アプリケーションID)は「appspot.com」のサブドメイン名になるため、全世界でユニークに決めなくてはならない。アプリケーションは合計10個まで作成できるが、その最初の1つを登録する作業である。

そして、このアプリケーションに対してデプロイすることになる。

アプリケーションIDが決まったら、プロジェクトを選択し、右クリックのプロパティーで「Google」->「App Engine Settings」を選択して、プロジェクトのデプロイ先として、先のアプリケーションIDを設定する(下)。バージョンは初回なので1とする。

ここまででデプロイの準備ができる。ここでは、先のスタブをデプロイしてみる。プロジェクトを選択し、右クリックのプロパティーで「Google」->「Deploy to App Engine」を選択する。下の画面がでるので、ここにGAEのアカウントを設定する(以下の図は、ヴァージョン2となっている。下の注記を参照のこと)。

ここでdeployを選択すると、以下のようなメッセージがEclipseコンソールに現れる。最後に「Deployment completed successfully」と出れば、デプロイが完了する。

Creating staging directory
Scanning for jsp files.
Scanning files on local disk.
Initiating update.
Cloning 1 static files.
Cloning 13 application files.
Uploading 5 files.
Uploaded 1 files.
Uploaded 2 files.
Uploaded 3 files.
Uploaded 4 files.
Uploaded 5 files.
Deploying new version.
Will check again in 1 seconds
Will check again in 2 seconds
Closing update: new version is ready to start serving.
Uploading index definitions.
Deployment completed successfully

ブラウザーを開き、

http://tetsuya-odaka.appspot.com/

にアクセスすれば、ローカル環境で見たのを同じ画面が現れるはずだ。

(注記)
GEAでは、バージョンを変えてデプロイをすることが可能で、管理画面も、同一のアプリケーションIDに対して、異なったバージョン毎に表示させることができる。たとえば、ヴァージョン2をブラウザーから参照する場合、URLは、

http://2.latest.tetsuya-odaka.appspot.com/

となる。参考:マイコミジャーナル「Google App Engine 10の事実」