こんばんは。システム部の佐々木です。
前回から少し日が空いてしまいましたが、本日はTaskQueueについて書きます。
読んで字の如く、Task(タスク)Queue(キュー)なのでできることはタスクのキューイングです。
簡単に説明すると非同期処理なのですが、前回説明したCronとは別の非同期処理になります。
Cron…実行タイミングがスケジューリングされている。
TaskQueue…キューイングはプログラムで行い、実行タイミングはGoogle App Engineが判断します。
Google App EngineではHttp(s)は30秒でタイムアウトする仕様になっています。
リクエスト時に大量データ登録などが発生してサーバの処理時間が30秒を超えた場合、
Google App Engineはエラーを返します。
極力重いアクセスを避けるのがよいのですが、そういう訳にはいかない場合もあるでしょう。
という訳なので重い処理を行う場合はTaskQueueを使用します。
使い方は至って簡単。
1.サーブレットを作る
前回のcronの時のようにサーブレットを一つ作ります。
ここではAsyncTaskControllerということにしましょう。(slim-genで自動生成)
Slim3の規約に従って<Slim3RootPackage>.queue.AsyncTaskControllerには”/queue/asyncTask”というURLでアクセスすることができます。
通例ですがcronと同様に”/queue/*”には管理者以外アクセスできないようにしましょう。
2.TaskQueueを呼びだす
最もシンプルなTaskQueueの呼び出しは次のようになります。
Queue queue = QueueFactory.getDefaultQueue(); queue.add(TaskOptions.Builder.withUrl("/queue/asyncTask"));
こうすることによってGoogle App Engineが/queue/asyncTaskに非同期でリクエストを送信してくれます。
上記は最も簡単な例ですが、GETまたはPOSTでTaskQueueにパラメータを渡すこともできます。
// GET queue.add(TaskOptions.Builder.withUrl("/queue/asynkTask?p1=aaa&p2=bbb").method(Method.GET)); // POST queue.add(TaskOptions.Builder.withUrl("/queue/asynkTask").param("p1", "aaa").param("p2", "bbb").method(Method.POST)); // オブジェクトも渡せる(未検証) // Serializeインターフェースを実装してるオブジェクトかつPOSTである必要がある List strList = Arrays.asList("1","2","3"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(strList); // サーブレット側ではバイト配列からオブジェクトをデシリアライズする queue.add(TaskOptions.Builder.withUrl("/queue/asynkTask").param("p1", baos.toByteArray()).method(Method.POST));
・デフォルトキュー
デフォルトキューはWEB-INF/queue.xmlの存在を必要としません。
queue.xmlが存在しない場合のデフォルトキューは毎秒5件でキューに積まれた処理を実行します。
もしデフォルトキューの設定を変更する場合はqueue.xmlを作成してname要素を”default”にします。
・設定値の詳細
queue.xmlで設定できる内容です。
name…キューの名称。QueueFactoryからキューを取得するときのキー名を設定します。
rate…10/sの場合だと1秒間に10回タスクが実行されます。
bucket-size…タスクを溜めておける量です。bucket-sizeを超過したタスクは、bucketに空きが出るまで待ち状態になります。
retry-parameter…タスクが失敗した際のリトライ回数を設定できます。
下記のサイトにてとても親切に和訳されていました。
http://elekmole.blogspot.com/2011/02/java-task-queue-configuration.html
・Google App Engine SDK1.5から追加された機能
プルキュー…今まではGoogleAppEngineがキューの制御(タスクのレート制御)を行っていましたが、
プログラムで任意にキューの実行を制御できるようになりました。
http://code.google.com/intl/en/appengine/docs/java/taskqueue/overview-pull.html
REST-API…TaskQueueにRESTでアクセスできるようになりました。
http://code.google.com/intl/en/appengine/docs/java/taskqueue/rest.html#method_taskqueue_tasks_list
その他…Cronも含めたバックグランド処理は上限時間が24hになったそうです。










