ひがやすを技術ブログ

電通国際情報サービスのプログラマ

Slim3 for Google App Engine/Java

Slim3をGAE/Jに対応させました。
デモサイトはこちら。
http://higayasuo.appspot.com/
ソースコードをチェックアウトしたい場合はこちら。
http://code.google.com/p/slim3/source/checkout
https://slim3.googlecode.com/svn/を指定してチェックアウトできます。デモ用のプロジェクトは、slim3-demoです。


SAStrutsのチュートリアルをやったことのある人なら、デモサイトが、そっくりだということがわかるでしょう。Slim3 Struts(SAStruts相当)がGAE/Jで動くわけです。
素のStrutsだとGAEではファイルアップロードに失敗しますが、Slim3 Strutsはその辺も対応してます。


やってみて感じたのは、GAE/Jは、制限が結構厳しいので、高度なフレームワークであればあるほど動作しないんじゃないかな。また、ローカルの開発サーバで動いても、クラウド上では動かなかったりすることも多いので、複雑なフレームワークは、嵌りやすいと思います。
クラウド上でうまく動かないときは、原因を追究するのがかなり難しいので、複雑なフレームワークは避けたほうが無難です。
Slim3では、DIとAOPも削りました。せっかく高速な実装ができたんだけど。嵌りがちな機能は基本的に避け、べたに実装したほうがいいと思います。


きつかったのは、Thread#setContextClassLoader()が使えないこと。Slim3お得意のHOT deployが使えません。最新のSlim3では、アクションクラスのみHOT deployが使えるようになっています。このほうが、ClassCastExceptionなどが発生することがなく、わかりやすくて嵌りにくいかなと思っています。
ローカルの開発サーバでも、DEBUGモードで立ち上げれば、HOT deployっぽいことができますが、あれは、Java Platform Debugger Architecture (JPDA) を多分使っていて、HOT deployできるのは、かなり限定的な操作だけなので、HOT deployになるときとならないときの判断が難しく、嵌りやすいと思います。


データアクセスは、BigTableを使うので、これまでのO/R Mapperは役に立たないし、そもそもRDBMSと同じ考えを持ち込むと失敗します。クラウド上のモデリングはこれまでとまったく違うものです。


これから、JDOを使った、タイプセーフな流れるようなインターフェースを使うデータアクセスフレームワークを作る予定。SQLファイルはもちろんなし。BigTable用のJDOは、複雑なことができないので、すべてタイプセーフな流れるようなインターフェースで実装することができます。
こんな感じかな。

EmployeeMeta e = new EmployeeMeta();
List<Employee> list = JDO.from(Employee.class)
                         .where(e.id.eq(1), e.name.contains("A"))
                         .orderBy(e.id.asc, e.name.desc)
                         .getResultList();


Employee emp = new Employee();
emp.setName("Hoge");
JDO.makePersistenceWithTransaction(emp);
JDO.deletePersistenceWithTransaction(emp);


JDO.transaction(new TransactionCallback<Void>() {
    ...
});


BigTableは、スキーマがないので、エンティティクラスがドメインの中心になります。ビジネスロジックは、エンティティに書いたほうがいいでしょうね。
基本は、アクションとエンティティで、アクションからJDOを直に呼ぶのでDIはもう必要ないのです。
エンティティのメタクラスは、antもしくはEclipseのプラグインで自動生成する予定です。JDOのenhancerと同じ感じかなと思っています。


クラウドはバズワードで俺には関係ないと思っていたけど、GAE/Jが出た以上先頭を走らないとね。
GAE/Jは、破壊的な技術になる可能性があります。クラウド上の勢力図は、これまでとまったく違うものになるでしょう。


Slim3のプロジェクトをGoogle Code上に作ってみたのは、GAE用のプロジェクトなので、そのほうが自然かなと思ったからです。別にSlim3がSeasar foundationから抜けるわけではないので、心配なく。


追記:今回のSlim3 for GAE/Jは、Slim3の本流です。Slim3が出て、Seasar2のユーザが迷うのはできるだけ避けたかったので、クラウドはSlim3、これまでのような開発はSeasar2という使い分けでいいのではないかと思っています。
たまたまですが、うまく使い分けできる形になりましたね。
一応、Slim3 Strutsは、GAE/Jに依存しているわけではないので、通常のStrutsの開発にも使うことはできます。「SAStrutsは使いたいんだけどDIとかはちょっとかんべん」とか思っていた人には向いてますね。