document

slim3 GAE task queue retry機構

タスクを作って5回失敗したら、やめるようにする。

queue.xmlの

<task-retry-limit>5</task-retry-limit>

で回数制限できる。

slim3のプロジェクトの中で作ったファイルは3つ

/src/gaej2011/controller/StartTaskQueueController.java
/src/gaej2011/controller/tq/ExecTaskQueueController.java
/war/WEB-INF/queue.xml

失敗させる方法はExecTaskQueueController?

HTTP ステータス コード 200〜299 の範囲外を返えす

と、エラーと判断されて、リトライするようになる

5回過ぎたら、ログをしたかったので、自分のところでも、

request.getHeader("X-AppEngine-TaskExecutionCount");

を使ってリトライ回数をカウントするようにした。

Google App Engine for Java実践ガイドの本とこのサイトを主に参考にした。

Google App Engine Task Queueを利用するJavaコード <http://www.synaesthesia.jp/googleAppEngine/task_queue_java.html>

StartTaskQueueController?.java

タスクをキックするクラス

	package gaej2011.controller;
	import java.util.logging.Logger;
	import org.slim3.controller.Controller;
	import org.slim3.controller.Navigation;
	import com.google.appengine.api.taskqueue.Queue;
	import com.google.appengine.api.taskqueue.QueueFactory;
	import com.google.appengine.api.taskqueue.TaskOptions;
	public class StartTaskQueueController extends Controller {
	    static final Logger LOGGER = Logger.getLogger(StartTaskQueueController.class.getName());
	    
	    @Override
	    protected Navigation run() throws Exception {
		Queue queue = QueueFactory.getQueue("queuetest");
		queue.add(TaskOptions.Builder.withUrl("/tq/ExecTaskQueue"));
		return null;
	    }
	}

ExecTaskQueueController?.java

実際に作業するクラス(ここでは今の時間のログをとるだけ)

	package gaej2011.controller.tq;
	import java.util.Date;
	import java.util.Enumeration;
	import java.util.logging.Logger;
	import org.slim3.controller.Controller;
	import org.slim3.controller.Navigation;
	/**
	 * x秒間隔で実行
	 * 5回失敗したら、リトライを終了する
	 */
	public class ExecTaskQueueController extends Controller {
	    static final Logger LOGGER = Logger.getLogger(ExecTaskQueueController.class.getName());
	    final int RETRY_LIMIT = 5;
	    
	    @Override
	    protected Navigation run() throws Exception {
		String headerTaskExecutionCount = request.getHeader("X-AppEngine-TaskExecutionCount");
		
		if( headerTaskExecutionCount.isEmpty() == false ){
		    System.out.println("headerTaskExecutionCount="+headerTaskExecutionCount);
		    int count = Integer.parseInt(headerTaskExecutionCount);
		    if(count >= RETRY_LIMIT){
		        LOGGER.severe("task queue over limit!!!!!!!!!!!!!!!!!!");
		        //オーバーしたのでこれ以上タスクを回さないように正常終了する
		        return null;
		    }
		            
		}
		//exec something....
		LOGGER.warning("test!!!!!!!!!!"+new Date().toString());
		
		//わざと失敗させる
		//特定のタスクが実行に失敗すると(200〜299 の範囲外の HTTP ステータス コードが返されます)
		//<https://developers.google.com/appengine/docs/java/taskqueue/overview?hl=ja>
		response.setStatus(500);
		response.getWriter().println("500 Internal Server Error");
		
	//        Enumeration headerNames = request.getHeaderNames();
	//        while(headerNames.hasMoreElements()){
	//            Object nextElement = headerNames.nextElement();
	//            System.out.println(nextElement.toString());
	//            System.out.println("value="+request.getHeader(nextElement.toString()));
	//        }
		return null;
	    }
	}

queue.xml

設定ファイル

	<queue-entries>
	  <queue>
	    <name>default</name>
	    <rate>10/s</rate>
	  </queue>
		<queue>
			<name>queuetest</name>
			<rate>2.0/s</rate><!-- 2秒に回実行されます。 -->
			<bucket-size>1</bucket-size><!-- トークンバケットのサイズです。この値がを小さくしておけば、急激なタスク増加が起きてもちょっとずつ実行してくれます。 -->
			<retry-parameters>
				<task-retry-limit>5</task-retry-limit> <!-- 最大リトライ回数です。 -->
				<!-- <task-age-limit>1d</task-age-limit> --><!-- タスクの最大生存日数です。 -->
				<!-- 
				両方の限界なので今回はコメントアウトする
				The maximum number of retry attempts for a failed task. If specified with task-age-limit, App Engine retries the task until both limits are reached. 
				 -->
			
				<!-- この設定だと、「10s, 20s, 30s, ..., 190s, 200s, 200s, ...」この間隔でリトライされます。 -->
				<min-backoff-seconds>10</min-backoff-seconds><!-- 最初の実行から最初のリトライまでの間隔です。 -->
				<max-backoff-seconds>100</max-backoff-seconds><!-- リトライ間隔の最大の値です。 -->
				<max-doublings>0</max-doublings><!-- もしこの値が2だと、「10s, 20s, 40s, 80s, 120s, 160s, 200s, 200s, ...」この間隔でリトライされます。 -->
			</retry-parameters>
		</queue>
	</queue-entries>

参考リンク

Google App Engine Task Queueを利用するJavaコード <http://www.synaesthesia.jp/googleAppEngine/task_queue_java.html>

Google App Engine Task Queueの設定ファイル例 <http://www.synaesthesia.jp/googleAppEngine/task_queue_config.html>

Java Task Queue Configuration - Google App Engine ― Google Developers <https://developers.google.com/appengine/docs/java/config/queue>

設定パラメータが詳しく書いてある

Task Queue Java API の概要 - Google App Engine ― Google Developers <https://developers.google.com/appengine/docs/java/taskqueue/overview?hl=ja>

Task Request Headers <https://developers.google.com/appengine/docs/java/taskqueue/overview-push?hl=en>

X-AppEngine-TaskRetryCount, the number of times this task has been retried; for the first attempt, this value is 0. This number includes attempts where the task failed due to a lack of available instances and never reached the execution phase.
X-AppEngine-TaskExecutionCount, the number of times this task has previously failed during the execution phase. This number does not include failures due to a lack of available instances.

Impress Japan: Google API Expertが解説する Google App Engine for Java実践ガイド <http://www.impressjapan.jp/books/3173>

GAE/Pタスクキューで実行頻度の設定と、無限リトライ防止 <http://linux.oboe-gaki.com/archives/000364.html>

ぶいてく: 【Google App Engine】 TaskQueue?は信用できないで御座候 <http://blog.virtual-tech.net/2010/01/google-app-engine-taskqueue.html>

Slim3 Datastore と Task Queue に触ってみた - bufferings <http://d.hatena.ne.jp/bufferings/20091202/1259775673>

Google App Engine 〜 TaskQueue? | R-Labs <http://blog.r-learning.co.jp/archives/730>

はなたんのブログ » 遅ればせながらGAE/J で TaskQueue? を試す <http://www.tdtsh.com/blog/archives/1523>

Task Queueの最新情報!【設定ファイル例付き】 <http://www.synaesthesia.jp/googleAppEngine/taskQueue2.php>


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-02-26 (火) 14:33:11 (2247d)