2013年1月10日木曜日

セッション共有に頭を悩ませる必要がない | Play Framework2.0 ここがいい!

あんまりPlay Frameworkの気になるところばかりを書いていてもあれなので、いいところも書いてみたいと思います。

Play Frameworkはポートを変えて複数起動するのが簡単に行えます。
そのため、フロントエンドをApacheにし、Proxyの設定で複数のPlay Frameworkに振り分けを行う設定ができます。

Play FrameworkもやはりJavaの子、再起動には多少時間がかかります。アプリケーションの規模にも寄ると思いますが1分くらい起動にかかるので、果たしてこれが瞬断といえるか、というとまあ言えないですね。

そんなときにリバースプロキシとしての Apacheを上手く使ってあげて、
1つのアプリを起動している間に、別のポートで立ち上げていたもう1つのアプリ側に振り分ける。
それが終わったら今度は逆に振り分けを行う、といった設定をしてあげます。

詳しくは
http://www.playframework-ja.org/documentation/2.0.4/HTTPServer
に載っています。

ちなみに待機系を指定する status=+H オプションはApacheのバージョンによっては使用できないため注意が必要です。

そこでこのURLに書いてあるとおり、セッション共有に頭を悩ませることはないということだそうです。

ただ実はPlayでSessionと呼んでいるものは実際にはCookieのことなので、サーブレットでいうSessionに近いものはCacheとなり、これは別ポートで立ち上げたアプリごと別になります。
つまり、Cacheにログイン情報とかを入れてると共有できなくなってしまいます。(当然といえば当然ですが・・・)

メンテナンス等を行う場合はApache側でメンテナンス画面を返すようにするとか一瞬のセッショ切れも、ログイン画面へ転送されるものとして割り切るかという判断になるかと思います。

大規模対応のためDBにセッションデータを入れるなんてプラグインすでにあるのだろうか・・・

SSLを使おうとするとApacheが必要になる | Play Framework2.0 ここんがんばれ!

SSLをPlay Framework2で使いたい、でしたらApacheを使いましょう!枯れたもとい安定した技術、お勧めです!

http://www.playframework-ja.org/documentation/2.0.4/HTTPServer

Webアプリケーションを作ったもののSSLを使って公開したいなあ、そんな時もあるでしょう。わかります。僕も人の子です。
Play Framework2.0.4ではSSL非対応です。
将来対応する、なんて話をどこかで耳にした記憶があります。
来るべき将来に備えて、まず今はApacheを使いましょう。
Apacheじゃなくてもいいですが。

SSLを使いたい場合はApache側でSSLの設定をしてProxy通すようにしてあげましょう。上記リンク先にある設定みたいに443ポートに対してProxyの設定を下記みたいな感じで設定してあげましょう。


<VirtualHost *:443>
  ProxyPreserveHost On
  ServerName www.loadbalancedapp.com
  ProxyPass  /excluded !
  ProxyPass / http://127.0.0.1:9000/
  ProxyPassReverse / http://127.0.0.1:9000/
</VirtualHost>
SSL接続の時、asettsがどうなるか、僕は知りません。
Apacheを使ってしまうんだったら、Apacheで静的ファイルは返してしまえばいいんじゃないか、そう思います。

残念ながら今のPlay Frameworkでは単体で全てをまかなえるレベルにまでなっていません。そこまで行けば取り扱いが大分楽になると思うのですが。

2013年1月8日火曜日

bootstrapをAndroid2.3系で使えるようにするためにはApacheが必要になる | Play Framework2.0 ここんがんばれ!

bootstrap、よく使いますよね。

Play Frameworkではassertかassetsか何かを使ってNettyサーバ経由で画像やJavascriptを返すようになっています。(おそらくそういうことなんだろうと思ってます)

さて、通常のブラウザを使うぶんには何ら問題ないのですが、以下の組み合わせでモーダルダイアログが表示されないなどの現象が発生しました。

Play Framework 2.0.4
bootstrap
Android2.3

なかなかニッチな環境かもしれませんが、Android2.3系はまだバリバリ現役なので、注意が必要です。
http://www.playframework-ja.org/documentation/2.0.2/Assets

Play 2.0 には、公開アセットを提供する組み込みのコントローラが付属しています。デフォルトでは、このコントローラは、キャッシュ機能、ETag、gzip圧縮、JavaScript minify のサポートが提供されます。
とあるので、ここらへんが影響してる可能性がありそうですね。

Apache経由で静的ファイルを返すようにすることで回避できましたが、Play Frameworkはそれ単体だけでは完結できないのに、Tomcat用にwarファイルを作るのもできない(Play Framework1系では対応していたようですが、2系からはプラグインでの対応!?になったようです)のでちょっと残念です。

Modelが自動生成されない | Play Framework2.0 ここんがんばれ!

PHPのフレームワークである、SymfonyやGAEのフレームワークであるSlim3を触ってきた経験から、Play FrameworkにはモデルやServiceの自動生成がないのが非常に残念に感じます。

Symfonyはかなり律儀なやつで、ymlからモデルの自動生成をやってくれていました。(Play Frameworkも1系の頃にはそんなのもあったようだと聞きました。)
ymlにルールを記述して自動生成すると、ymlの定義に従ったBaseとなるModelが生成されます。そしてそれをオーバーライドする形でもう一つModelが生成され、通常はこちらにアクセスをするようになっていました。
また、Modelとは別に、Listの取得などを行うPeerと呼ばれるファイルも自動生成されいました。(Slim3で言うところのSeviceに当たりますね。)

今までの経験からPlay Frameworkの場合は以下が自動生成されてくれるようになるとより使い勝手が良く、複数人で開発をする場合も統一性が取れるのではないかと考えています。


  • DBの構造と完全に1対1で対応している基底となるModelクラス(自動生成のため、手作業による変更は行わない)
  • 基底クラスをオーバーライドするModelのクラス(例えば住所をつなげたものを返すなどのメソッドの追加などはこちらで行う。)
  • 基底クラスをオーバーライドするJson用のModelのクラス
  • save,deleteなどのモデルに対する操作を行うクラス
  • list等のモデルのデータ取得を行うクラス

Play Framework2.0 でSQLを出力する方法

Play FrameworkのJava版ではORMにEbeanが使えるのですが、どんなSQLが発行されているか、確認をしたいケースがあります。

そんな時には、application.confに以下のように追記することで、コンソールおよびログファイルに実際に発行されているSQLが出力されるようになります。


db.default.logStatements=true
logger.com.jolbox=DEBUG

Stackoverflowに載ってました。
http://stackoverflow.com/questions/9719601/play-framework-2-0-and-ebean-sql-logging