Queueの簡単な使い方を解説します。何でも聞いてください。追記このページの内容は古くなったので、最新の情報で書き直しました。SDKからなくなったみたいです。Queueのどちらとも、10分まで実行できるようになりました。Queueと呼ばれる仕組みがあります。プログラムの実行を行う仕組みです。Exceptionが起きたとしてもやり直してくれません。自動で再実行され、Exceptionが起きた時は自動的にやり直してくれます。毎秒数回のペースで実行することができます。Queueですが、2010年10月の時点ではまだ日本語の資料が乏しいです。Queueの使い方をサンプルコードをまじえてできる限り簡単に解説します。Queueの設定ファイルに関するページはこちらです。Configuration英語でわけが分からない人も多いと思うので、具体的なサンプルと共に解説します。Queue設定ファイルの全てです。このコードを、queue.xmlというファイル名でwar/WEB-INFの中に保存してください。Queueが使えるようになります。◇nameタグnameタグはそのqueueの名前です。Queueを実行する際に必要になります。自分が分かりやすい名前をつけましょう。記号はハイフンしか使えないので注意してください。これとは別に、taskの名前も存在します。queueが存在し、このqueueを何個か実行しようと思ったら、それぞれにtaskの名前を付けて実行することになります◇rateタグrateタグはある時間内に実行できる最大の数です。5/sなら1秒間に5回、2000/dなら1日に2000回実行できますたぶん、1日に~回という設定にすることは少ないと思います。こんな大雑把な数字では負荷の分散ができませんし。◇bucket-sizeタグbucket-sizeタグは、専門的な言い方をするとトークンバケットのサイズのことです。taskを1回実行するためにはトークンが1つ必要です。このトークンをためておける最大のサイズがbucket-sizeなわけです。上記のコードのmail-queueを例に挙げて説明します。taskがない時、トークンは常に10個(bucket-sizeの値)たまっています。トークンを7個消費してこのtaskは全部即座に実行されます。taskが一気に12個くると、トークンを10個消費して10個のtaskが実行されます。それから1秒経過するとトークンが5個(rateの値)補充されます。ここでやっと11個目と12個目のtaskが実行されるわけです。使うクラスとAPIの一覧(英語)はこちらです。com.google.appengine.api.labs.taskqueueこれだけを見せられても具体的な使い方が分からないと思うので具体的なコードを載せておきます。importするのは以下のクラスです。com.google.appengine.api.labs.taskqueue.TaskOptions.Method;次はJavaのコードです。あるURLにアクセスするだけなら以下の1行だけです。QueueFactory.getDefaultQueue().add(Builder.url("/printdata"));getDefaultQueue()はデフォルトのqueueを作ります。queue.xmlに明示的に書いていなくてもデフォルトキューは作ることができます。url("/printdata")はこのtaskに実行してもらうURLです。デフォルトではPOSTメソッドを使ってアクセスします。QueueFactory.getQueue("mail-queue").add(Builder.url("/printdata").method(Method.GET));今度はgetQueue("mail-queue")を使いました。することで、mail-queueのrateタグ、bucket-sizeタグの値が利用されます。method(Method.GET)をつけたことでGETメソッドを使ってアクセスします。ここをPOSTに変えると、POSTメソッドでアクセスするようになります。1234)を付けました。これはPOSTメソッドで渡すパラメータの値です。5、6個くらいだったら普通に大丈夫だと思います。QueueFactory.getQueue("mail-queue").add(Builder.url("/printdata").taskName("20101004-2004-create").method(Method.GET));taskName("20101004-2004-create")を付けました。これにより、mail-queueというqueueの、20101004-2004-createというtaskが作られます。taskの名前は重複することができません。実行が終わった後も、1週間くらいは同じ名前を付けられないようです。名前に入れて重複しないよう管理しましょう。記号はハイフンしか使えないので注意してください。taskName()を省略すると、Long型の値が勝手に付けられます。queueの名前、taskの名前、再実行された回数はHTTPヘッダの中に埋め込まれます。「X-AppEngine-QueueName」queueの名前。この場合mail-queue「X-AppEngine-TaskName」taskの名前。この場合は20101004-2004-create「X-AppEngine-TaskRetryCount」このtaskが再実行された回数。最初の1回目の場合は0QueueFactory.getQueue("mail-queue").add(Builder.url("/printdata").countdownMillis(10000));最初の1回をある一定時間後に実行したい場合は、countdownMillis(10000)を付けます。この場合は、10000ミリ秒(10秒)後に実行されます。Engine側で勝手に決められます。ように段階的に長くなるようです。負荷が少ない時を見計らって実行してくれるようですExceptionがでたらやり直してくれるのですが、catchしてしまうと正常に実行されたとみなされるので再実行されません。Exceptionはcatchせずに無視しましょう。"test")を使えばヘッダの値を追加することができます。Queueにも30秒制限があるので注意しましょう。将来的にはなくなるとか書いてありますが、少なくとも現時点では存在します。Queueの30秒制限が段階的になくなっているっぽい??です。EngineのLogに、34224msのように30秒を超えるものがたまにでてきます。SDKからなくなったみたいです。Queueのどちらとも、10分まで実行できるようになりました。順番に実行する必要のある大きなプログラムを小さいプログラムに分割して実行する場合とかだと思います。RuntimeException()を実行、とかするのが現実的だと思います。このように、自分の実行が終わったら新しいtaskを追加するような仕組みを工夫すれば、長時間が必要な処理もうまくやりくりできるはずです。何でも聞いてください。見つからなかったならご連絡ください。詳しく調べて、ネットでは見つからないような良質で科学的な情報を掲載いたします。