ウェブサービスを作っています。

開発環境で Task を順番に実行する

GAE SDK (Java) 1.2.8 から、開発環境で Task Queue に Task を追加すると自動的に実行されるようになりました。
しかし現在のバージョン (1.3.0) では、開発環境の場合に rate や bucket-size が考慮されません。
Task Queue Java API の概要 - Google App Engine — Google Developers


URLFetch を使うようなタスクの場合に、これでは困るときがあります。
そこで、タスクを順番に実行するスクリプトを書きました。


run_tasks.rb

#!/usr/bin/env ruby

require 'rubygems'
require 'mechanize'

console_path = 'http://localhost:8080/_ah/admin'
run_queues = %w(first-queue second-queue)

agent = WWW::Mechanize.new
run_queues.each do |queue_name|
  loop do
    agent.get "#{ console_path }/taskqueue?queueName=#{ queue_name }"
    execute_forms = agent.page.forms.find_all { |form|
      form.fields.map { |v| v.name }.include?('action:executetask')
    }
    break if execute_forms.empty?

    execute_forms.each do |form|
      puts "running #{ form.field_with(:name => 'taskName').value } (#{ queue_name })..."
      form.click_button
    end
  end
end


7 行目の

run_queues = %w(first-queue second-queue)

は、実行するキューに書き換えてください。

使い方

まず、

$ dev_appserver.rb --jvm_flag=-Dtask_queue.disable_auto_task_execution=true .

のように、--jvm_flag=-Dtask_queue.disable_auto_task_execution=true をつけて開発環境サーバを起動します。
これによって、タスクが自動的に実行されなくなります。


あとは、上のスクリプトを実行するだけです。

$ ruby run_tasks.rb