Новая ошибка с методом постановки в очередь delayed_job - PullRequest
1 голос
/ 21 октября 2011

Вот моя модель:

class Scraper

def perform

Tracker.all.each do |tracker|

    doc = Nokogiri::XML(open('http://share.findmespot.com/messageService/guestlinkservlet?glId=' + tracker.glid + '&completeXml=true') )

    doc.xpath('//messageList/message').map do |m|
      s = Spot.new({ :tracker_id => Tracker.find_by_esn(m.xpath('esn').text).id, :messagetype => m.xpath('messageType').text, :timestamp => m.xpath('timestamp').text, :latitude => m.xpath('latitude').text, :longitude => m.xpath('longitude').text, :timeingmtsecond => m.xpath('timeingmtsecond').text})
      s.save
    end

end

Delayed::Job.enqueue(Scraper.new, :run_at => 5.minutes.from_now)

end

def error(job, exception)
# Send a warning email to yourself, or whatever.
# The scraping will automatically be retried.
end

def success(job)
# Schedule the next scraping.

end

end

Получение этой ошибки:

> ** Execute gps_start rake aborted! undefined method `to_i' for {:run_at=>Fri, 21 Oct 2011 11:37:19 EDT -04:00}:Hash
> /app/.bundle/gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/backend/base.rb:21:in
> `enqueue' /app/lib/scraper.rb:16:in `perform'
> /app/lib/tasks/tracker.rake:4
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/task.rb:205:in
> `call'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/task.rb:205:in
> `execute'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/task.rb:200:in
> `each'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/task.rb:200:in
> `execute'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/task.rb:158:in
> `invoke_with_call_chain' /usr/ruby1.8.7/lib/ruby/1.8/monitor.rb:242:in
> `synchronize'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/task.rb:151:in
> `invoke_with_call_chain'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/task.rb:144:in
> `invoke'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/application.rb:112:in
> `invoke_task'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/application.rb:90:in
> `top_level'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/application.rb:90:in
> `each'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/application.rb:90:in
> `top_level'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/application.rb:129:in
> `standard_exception_handli ng'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/application.rb:84:in
> `top_level'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/application.rb:62:in
> `run'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/application.rb:129:in
> `standard_exception_handli ng'
> /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/lib/rake/application.rb:59:in
> `run' /app/.bundle/gems/ruby/1.8/gems/rake-0.9.2/bin/rake:32
> /app/.bundle/gems/ruby/1.8/bin/rake:19:in `load'
> /app/.bundle/gems/ruby/1.8/bin/rake:19 Tasks: TOP => gps_start

Ответы [ 2 ]

2 голосов
/ 28 октября 2011

Это зависит от того, какую версию delayed_job вы используете. В последней версии действительно требуется хэш параметров с поддерживаемыми ключами: priority и: run_at. Однако, если вы используете более старую версию delayed_job, она работает как Ответ 1.

1 голос
/ 21 октября 2011

Delayed::Jobs::enqueue не принимает хэш опций. Требуется от 1 до 3 параметров в следующем порядке:

  • Работа
  • Приоритет (необязательно)
  • Время выполнения (опционально)

Поскольку вы передали хэш опций для второго параметра, он вызывает #to_i, чтобы попытаться превратить его в приоритет, что приводит к получаемой вами ошибке. Если вы хотите указать только время выполнения, вы можете передать nil для приоритета, и он будет использовать приоритет по умолчанию:

Delayed::Job.enqueue(Scraper.new, nil, 5.minutes.from_now)
...