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

Ruby で Task Queue

GAE SDK (Java) 1.2.5 から、Task Queue がサポートされて、appengine-apis (0.0.9) にも早速実装されているようなので試してみました。
taskqueue という適当なタスク追加アプリケーションを sinatra で作ってみます。
ローカルでのみ確認しています。

$ mkdir taskqueue
$ cd taskqueue
$ sudo gem install google-appengine
$ appcfg.rb gem install sinatra appengine-apis


config.ru

require 'appengine-rack'
AppEngine::Rack.configure_app :application => 'taskqueue', :version => 1
require 'taskqueue'
run Sinatra::Application


taskqueue.rb

require 'rubygems'
require 'sinatra'
require 'appengine-apis/labs/taskqueue'

# fix appengine-apis bug
module AppEngine::Labs::TaskQueue
  class Task
    def add(queue=nil)
      # queue = Queue.new(queue) unless Queue.kind_of? Queue
      queue = Queue.new(queue) unless queue.kind_of? Queue
      @handle = queue.java_queue.add(_task)
      self
    end
  end
end

get '/' do
  # 引数を省略すると default キューができます。
  # queue = AppEngine::Labs::TaskQueue::Queue.new('hoge') のようにすると、hoge キューができます。
  # (ただし、hoge に関する記述を queue.xml にする必要があります)
  queue = AppEngine::Labs::TaskQueue::Queue.new

  (1..10).each do |i|
    task = AppEngine::Labs::TaskQueue::Task.new(:url => "/worker/#{ i }")
    queue.add task
  end

  'added tasks'
end
$ cd (gem のディレクトリ)/appengine-sdk-1.2.5/appengine-java-sdk-1.2.5/lib/user
$ sudo mv appengine-api-labs-1.2.5.jar appengine-api-1.0-sdk-labs-1.2.5.jar

appengine-api-labs-1.2.5.jar という jar がバンドルされないと Task Queue が使えないのですが、appengine-api-1.0-sdk- という prefix がついていないと google-appengine がバンドルしてくれないので、ファイル名を変更しています。

$ dev_appserver.rb .


http://localhost:8080/ を実行してから http://localhost:8080/_ah/admin/taskqueue で確認。