appengine java + slim3 の開発では、scenic3にお世話になっています。
scenic3は t2 frameworkのようなPageクラスをslim3で実現するslim3の拡張ライブラリです。
scenic3
ページ作るの便利なんで。
そのPageクラスを作るときにアノテーションとか忘れそうになるんでメモしておきます。
@Page リクエストパスの1個目?を指定する
@ActionPath = リクエストパスの2個目以降を指定する
手が覚えるまで迷うのがこれら。
@Var = リクエストパスの中に引数を指定した場合に書く
私にとってコレが簡単に出来る事がscenic3を使う理由のひとつ。
@RequestParam = リクエストパラメータ(GET引数)を引数にする場合に書く
勿論メソッド内で request.getParameter(“xxx”) とも書けるけど、明示的にメソッドの引数にも出来るってこと。
自然語でメモするとなんかややこしい・・・。
簡単なPageクラスはこんな感じになる。
@Page("/path")
public class PathPage extends ScenicPage
{
@ActionPath("to/{id}")
public Navigation list_json(
@Var("id") String id
, @RequestParam("limit") Integer limit
, @RequestParam("offset") Integer offset
)
{
// POSTの場合はコッチ
String hoge = (String) request.getAttribute("hoge");
....
return forward("/path/to/page.vm");
}
}
AppUrl.java への追加も忘れずに。
public AppUrls()
{
excludes("/_ah/*");
excludes("/remote_api");
add(PathPageMatcher.get());
}
google appengine / javaの話ですけど。
バッチとかならcron で何とかなるもんだからいままで曖昧にしてきた訳ですが、そろそろ TaskQueue を弄っていこうと思います。
知らんかった事その1
タスクとははURLを持ったただのサーブレット
使い方というか、Queueの登録の仕方はコチラは大いに参考にさせて頂いています。これ以上説明することがありません。
Task Queueの最新情報!【設定ファイル例付き】
知らんかった事その2
TaskQueue用のサーブレットってSlim3のControllerでもいけるし、素のServletでもいけるけど、戻り値はnullじゃないと延々とリトライされる。
(Exceptionをthrowしてもリトライされる。逆に言うとExceptionをcatchしてしまうとリトライされない)
それもあるから、Datastoreに書いたりするならべき等に実装しなきゃいかん。
知らんかった事その3
リトライに関してはqueue.xml でかなり細かく設定できる。
今は昔のkonjak翻訳 φ(・ω・? )…: Java Task Queue Configuration
色々出来そうですね。
がんばってみます。
個人的には .countDownMills(long) が便利だと思う。
5秒後に実行ならcountDownMills(5000L)。
Taskは(ある程度)細かいほどパフォーマンスいいみたい。
例えばどうしてもループの中にDatastore操作が入っちゃうみたいな場合は、TaskQueueの出番かな。
私が知らないだけかもしれませんがちょっと残念なのは、TaskのChainが作れない事です。
Aタスクを実行後Bタスクとかする場合は、Aタスクの中でBタスクを呼び出す様にネストせな仕方ないか。
Twitterボットでも作ってみようかな。
GAEが新料金になってから、Billing Historyをチェックするのが日課になっています。
いや、今までもそうですし、新料金でも充分安いんですけど、個人で払っているもので・・・
会社のプロジェクトとかでも、自腹でちょいちょいっと作るという事が出来るのは、非常に大きいんです。
まあ一日あたり$1に制限していますから、それを超える事はあり得ません。
うっかりQuotaを超えちゃっても、予算以上は請求されません。確認済みです。
・・・アレ?超えてる?
と思って確認したら、詳細は$0になっています。
見えますでしょうか。

下の「Total:(before
clipping to daily budget)」 は $0.00. なのに、上の「Usage Report for 2011-11-23」 の Amount が $1.16 になっています。
なんで!
とりあえず、書いてあるメールアドレスに送っておきました。
2011/11/26 追記
週次のミニマムチャージが $2.1 だからの様です。
Billing Setting の Set Budget の中にめっちゃ書いてました。
今まで1週間に2.1ドル以下な事がなかったので気づかなかっただけでした。
The Minimum spend subtotal is in support of our new pricing model.
The new model requires that you spend at least $2.10/week.
This subtotal indicates the value beyond your other spend
that we need to add to your contract.
To make the transition to the new model smoother we are beginning to account
for this minimum when we authorize new budget changes.
Please note that you will not be charged for the minimum spend until our new model takes effect.
はずかしいです。
@takawitter さんご指摘ありがとうございました。
appengineのDatastoreにいつのまにか
slim3.GlobalTransaction
と
slim3.Lock
というEntityが出来ていました。とくにslim3.Lockがいっぱい。
Slim3のGlobalTransactionが失敗した形跡があるんで、その残骸なんでしょうか。
暫くしたら消そう。
今日、GAE/Jでeclipseからデプロイしようとすると、失敗しました。
ダイアログはこんな感じです。
Unable to update app: Error posting to URL: https://appengine.google.com/api/appversion/startserving?app_id=XXXXXXX&version=XXXX&
409 Conflict
No transaction is in progress.
前にも何度かやった気がするけどイチイチ忘れるんでメモ。
appengine java sdk がインストールされていればそれを使えばいいんだけど、eclipse の Plugin としてインストールしているなら、eclipse のインストールディレクトリのpluginの中にSDKがそっくり存在します。
私のいまの環境ではこんな感じでした。
cd c:\eclipse\plugins
\com.google.appengine.eclipse.sdkbundle_1.5.5.r36v201110112027
\appengine-java-sdk-1.5.5\bin
(実際は1行)
appcfg.cmd rollback c:\git\PROJECTNAME\war
参考にした先人の知恵
一日一歩: GAE/J デプロイにて 409 conflict が出た場合の対処