Download - Grails on GAE/J
Grails on GAE/J
制限事項•Quotashttp://code.google.com/appengine/docs/quotas.html
• The Java Servlet Environmenthttp://code.google.com/appengine/docs/java/runtime.html
• Google App Engine for Java Questionshttp://code.google.com/appengine/kb/java.html
LimitとQuota• Limit• 制限以上は使えない•例)メールのサイズは1Mまで•Quota•お金を払えば増やせる•例)メール送信 2,000 → 7,400,000
Quotas
•無料でどれだけ使えるか•Daily LimitとMaximunRate (分単位)•各API単位とかで細かく指定されている
Request 1,300,000/day、7,400/min
DatastoreAPI 10,000,000/day、57,000/min
The Java Servlet Environment
• 30秒ルール• Thread、FileSystem、java.lang.System、Reflectionの制限
• Request/Responseのサイズ、同時リクエスト数、アプリ内のファイル数/ファイルサイズ
Datastore
Bigtable
•分散ストレージ• RDBMSではない(SQL使えない)• JDO/JPAでアクセスする•使い方は後述
Servcies
用意されてるもの•Memcache• URL Fetch• Mail• Images• Google Accounts
Memcache
•分散インメモリデータキャッシュ• JCache(JSR107)を(ほぼ)実装•完全なKey-Value
Memcacheの有効期限
•デフォルトはメモリ残量がなくなるまでメモリがなくなれば古いのから消える
•有効期限の指定可キャッシュ時間(秒、ミリ秒)
キャッシュ有効期限(java.util.Date)
Memcacheの使用例
•トップページの表示データを格納•マスタデータの格納•GAEっぽい使い方、募集!
Create/Put Memcacheimport javax.cache.*
class BootStrap { def init = { def manager = CacheManager.getInstance() def cache = manager.cacheFactory.createCache([:]) def value = ... // from datastore cache.put('key', value) manager.registerCache('mycache', cache) }}
※あとはCron Jobで定期的にキャッシュ更新
Get Memcache
import javax.cache.*
class CacheController { def index = { def manager = CacheManager.getInstance() manager.getCache('mycache').get('key') }}
CacheManagerはBeanBuilderで定義すると便利
≪grails-app/spring/resources.groovy≫beans = { cacheManager(javax.cache.CacheManager) { it.factroyMethod = 'getInstance' }}
≪Controller≫class SampleController {def cacheManagerdef someMethod = {def cache = cacheManager.getCache(‘mycache’)
}}
Quotas
http://code.google.com/appengine/docs/quotas.html#Memcache
URL Fetch
•HTTP/HTTPSでWeb上のリソースにアクセス
•もちろん自身のアプリもフェッチできる•ファイアーウォールの中のシステムにもアクセスできるらしい
URL Fetch
• java.net.URL、java.net.URLConnectionを使う
•Http(s)URLConnection はGoogle実装• connectTimeout、readTimeoutは変更できない(readTimeoutが5秒っぽい)
URL Fetch
class URLFetchController { def fetch = { new URL(‘http://...’).text }}
URL Fetchでやりたかったこと
•クライアントからPOSTされたJSコードをサーバで実行
• JSコードはもしかすると無限ループとかするかもしれないので3秒くらいでタイムアウトさせたい
•スレッド使えない → じゃあURL Fetchで
URL Fetchでできなかったこと
•URL Fetchを使ってもreadTimeoutが設定できない(5秒)
•非同期リクエストはできない(Pythonの方にはAsynchronous Requestsってのがある)
URL Fetchとは直接関係ないですが
• JSONデータをフェッチするときは、わざわざJSON-libを入れなくても、それっぽいAPIがGrailsにあります。
org.codehaus.groovy.grails.web.json.JSONObject
FixdapFeed(URL Fetchの実用例)
•http://fixdapfeed.appspot.com/• URL Fetchでfixdapからデータ取得•HttpURLConnectionを使用• http://d.hatena.ne.jp/uehaj/20090620/1245470865
•上原さん@JGGUG
Limit
http://code.google.com/appengine/docs/java/urlfetch/overview.html#Quotas_and_Limits
Quotas
http://code.google.com/appengine/docs/quotas.html#UrlFetch
• JavaMail APIを使ってメール送信•Mail Pluginが使える?// TODO 後で(ゲンゾウさんが)試す。
•開発サーバーではメール送信されない
メール送信
From管理者
ログイン中ユーザ
To/Cc/Bcc どこでも
ReplyTo 管理者
Limit
http://code.google.com/intl/ja/appengine/docs/java/mail/overview.html#Quotas_and_Limits
Quotas
http://code.google.com/appengine/docs/quotas.html#Mail
Google Accounts
•Googleアカウントによる認証と承認•ロールはユーザと管理者•Acegi Pluginみたいな感じ•ローカルテスト時は適当なメールアドレスでログイン可能
Authentication
≪grails-app/Config.groovy≫google.appengine.sessionEnabled = true // default truegoogle.appengine.enableSsl = true // default truegoogle.appengine.security.useHttps = ["/secure"]google.appengine.security.requireAdmin = ["/admin", "notsecure"]google.appengine.security.requireLogin = ["/admin", "/"]
local GAE
com.google.appengine.api.users
• User(ログインユーザ情報)•UserService(ログインユーザ管理)•UserServiceFactory
import com.google.appengine.api.users.*def loginUser = UserServiceFactory.userService.currentUser
Grails on GAE/J用のGoogleアカウント処理用タグリブ
• http://gist.github.com/125301• http://d.hatena.ne.jp/uehaj/20090607/1244376371
•上原さん@JGGUG
Images
•画像データを処理サイズ変更、回転、左右反転、トリミング、etc.
• 全く触ってません。