2013年8月15日木曜日

GAE + Go で指定した時刻に処理を実行する

Google App Engine では、taskqueue パッケージを使って指定した時刻に処理を実行することができます。「メールアドレスの仮登録後、24時間経っても本登録がされなかったらデータベースから削除する」みたいなときに便利です。
Task Queue Go API Overview - Google App Engine

パッケージのインポート
import "appengine/taskqueue"


タスクの作成

タスクは taskqueue.Task 型で表され、taskqueue.NewPOSTTask() 関数で作成できます。
タスクは、指定した URL に HTTP POST を送ることで実行されます。
ユーザからのアクセスと同様に handleFunc() 関数で処理を割り振ります。
url.Values 型で POST で引き渡すデータを指定できます。
また、 time.Duration 型で現在時刻からどれくらい後に実行するのかを指定できます。
ETA を使って実行時刻を直接指定することもできます。
実行時刻の指定がない場合、即時実行されます。
// POST で渡すデータ
values := url.Values{}
values.Set("interim_key", key)

// 24時間後に実行
delay, err := time.ParseDuration("24h")
Check(c, err)

// タスクの作成("/cancel" に POST で送信)
task := taskqueue.NewPOSTTask("/cancel", values)
task.Delay = delay


キューにタスクを追加

GAE ではアプリごとに複数のタスクキューを持つことができます。それぞれのタスクキューで、タスクを実行するタイミングや、キューの容量などを設定できます。
今回は最初から準備されている default という名前のキューにタスクを入れます。
default キューは実行できるタスクが無いか 5 秒毎にチェック・実行されます。
オリジナルのキューを作成する場合は queue.yaml を作って設定してください。
Go Task Queue Configuration - Google App Engine
タスクは taskqueue.Add 関数でキューに追加できます。
// task を default キューに追加する
taskqueue.Add(c, task, "default")

これで24時間後に実行されるタスクを作成できました。


URL を管理者専用にする 

このままではユーザが /cancel にアクセスできてしまうので管理者専用にします。
GAE + Go で管理者専用機能を作る - y.okano blog
を参考に app.yaml で login: admin を指定しておきます。


開発サーバでタスクを手動実行する

ローカルの開発サーバでは、デバッグ用に手動でタスクを実行するツールも付いています。これを使わなくても自動実行はできますが、手動で実行したい場合は利用します。

http://localhost:8080/_ah/admin/queues

にアクセスすることでキューの状態や、タスクの実行が可能です。


0 件のコメント:

コメントを投稿