Task Queue を使ってみる

Google App Engine Java のTask Queue を使ってみる。

Twitter4JとGAEとCytoscapewebの練習(空目の可視化)で作ったアプリのデータをJDOを使って永続化するようにした。永続化が原因かどうかは分からないがレスポンスが遅くなったような気がしたので、Task Queueを使ってみることにする。基本的には、Task Queue Java API Overviewをみてやってみる。

1.WEB-INF/queue.xmlの作成
Java Task Queue Configurationによると、こんな感じでいいみたい。

<queue-entries>
<queue>
<name>default</name>
<rate>5/s</rate>
</queue>
</queue-entries>




2.Memcacheに値を格納しておく。
今まで同期的にDatastoreにputしていたオブジェクトを一旦Memcacheに入れておく。
Memcache java API 概要を参考に。

cache = CacheManager.getInstance().getCacheFactory().createCache(Collections.emptyMap());
cache.put(key, obj);
(例外処理など略)



3.Queueに追加する処理を書く
Using Task Queue in Javaによると、以下のようにすると、defaultキューが取得できるようだ。

Queue queue = QueueFactory.defaultQueue();
queue.add(url("/worker").param("key", key));
(例外処理など略)


サンプルはstatic importを使っているが、Eclipse は static import があるとコード補完がうまく働かなくなるようなので注意。

4.Web Hook を書く。
普通のサーブレットを書く、web.xmlにも(この例だと/workerというパスを)記述する。このサーブレットにパラメータ"key"でobjをmemcacheにputした際のkeyが渡ってくる。HTTPメソッドは特に指定しない場合、POSTが使われるので注意。その後、cacheからgetして、Datastoreに永続化する。

cache = CacheManager.getInstance().getCacheFactory().createCache(Collections.emptyMap());
Object obj = cache.get(key);
PersistenceManager pm = PMF.get().getPersistenceManager();
pm.makePersistent(obj);
(例外処理など略)



以上。問題なく動いたが、劇的に動作が速くはならなかった。原因は永続化ではなかったようだ。