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ボットでも作ってみようかな。
appengineのDatastoreにいつのまにか
slim3.GlobalTransaction
と
slim3.Lock
というEntityが出来ていました。とくにslim3.Lockがいっぱい。
Slim3のGlobalTransactionが失敗した形跡があるんで、その残骸なんでしょうか。
暫くしたら消そう。
先日 slim3 1.0.14 とグローバルトランザクションについて書きました。
その続編です。
slim3 の Datastore.beginGlobalTransaction() とか deprecated になってます。
やはりフツーのDatastore.beginTransaction() を使えと言う事ですね。
で、Cross-Group Transactions なんですけど、やはり今のところ 5 entity groups までしか対応していないようです。
確かに複数Entityでも、今までの様に「can’t operate on multiple entity groups in a single transaction.」とか怒られる事が無くなったんですが、いっぱいEntityをぶっこむ(Entity Group が5つ以上)と、「java.lang.IllegalArgumentException: operating on too many entity groups in a single transaction.」とか怒られてしまいます。
沢山のEntity Group を含むトランザクションを扱うシチュエーションでは引き続き slim3 の GlobalTransaction を使う事になりますね。
Slim3が1.0.14になってる訳ですが、手もとのeclipseを確認したら、slim3-1.0.12.jarじゃないですか。
Slim3 Eclipse Pluginで横着してたんで、気がつきませんでした。
ソフトウェアの更新で出現しないんですけど、勝手にjarを入替えちゃってもいいんですかね。
というかPluginで入れても、更新は手作業なのかな。 (後日ちゃんとslim3pluginのアップデートが配信されました (2011/11/09 追記))
やってみた。いけた。
Slim3 1.0.14から、appengine SDK 1.5.5のリリースを受けて、グローバルトランザクション周りが変わっているようです。
Datastore.beginGlobalTransaction() じゃなく、フツーのDatastore.beginTransaction() で、Cross-Group Transactionsに対応しているとか。
5 entity groupsまでなら、複数Entity Groupをぶっこんでも、問題なく更新とかできる様になっている筈。
今までは複数のEntity Groupをトランザクションに含めると「IllegalArgumentException:can’t operate on multiple entity groups in a single transaction.」とか怒られたんですが、今回からは 5 Entity Group 以上を含んだ場合出るのかな。
また今度ちゃんと試します。
試しました (2011/11/09 追記)
・・・おそらく GTXの実装には苦労された事と思うんですが、ひがさんの心中や如何に。