いつのまにかappengineの特定のアプリで少し前まで見られていたDatastore Admin のページが見られない様になっていました。
Internet Explorerで見られないとかそんなんじゃありません。ブラウザはWindows版 chrome, firefox、およびmac版chrome で試しました。
lastest というバージョン名は使っていないので、この現象とは違います。
Datastore Adminのページが開けない – Google グループ
経緯としては、最初こんなエラーが出たので、
Error: Not Found
The requested URL /_ah/login_required?continue=https://ah-builtin-python-bundle-dot-latest-dot-slow-net.appspot.com/_ah/datastore_admin/?app_id=s~xxxx was not found on this server.
Application Settingsから、「Datastore Admin」を「Disable」して「Enable」をクリックしたんです。
その後、Datastore Adminをみたらこんな事を言われ
サードパーティのサービスが Google アカウント へのアクセスを許可するようリクエストしています。
使用するアカウントを選択してください。
「次へ」をクリックしたらそれ以降、Datastore Adminの画面が真っ白のままです。
Google グループ へ投稿しました。
Datastore Admin のページが見られない(真っ白) – Google グループ
そしてすぐに解決しました。
Authentication Options を Federated Login にしてるせいでした。
多分 Federated Login にしていると Bulkloader が使えないのと同じ理屈なんでしょうね。
issue trackerをよく見れば判ったものを、慌ててました。
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() を使えと言う事ですね。※
※2012年4月4日追記
今はappengine-web.xml とかで slim3.useXGTX=true しないとCross-Groupなトランザクションになりません。
404 shin1のつぶやき ないわー Not Found: Slim3 Cross Group TransactionをUnit Testで使う
で、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 を使う事になりますね。