Новая ошибка с методом постановки в очередь delayed_job

#ruby-on-rails #delayed-job

#ruby-on-rails #отложенное задание

Вопрос:

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

 class Scraper

def perform

Tracker.all.each do |tracker|

    doc = Nokogiri::XML(open('http://share.findmespot.com/messageService/guestlinkservlet?glId='   tracker.glid   'amp;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
 

завершение

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

 > ** 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
 

Ответ №1:

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

Ответ №2:

Delayed::Jobs::enqueue не принимает хэш параметров. Он принимает от 1 до 3 параметров в таком порядке:

  • Задание
  • Приоритет (необязательно)
  • Время запуска (необязательно)

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

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

Комментарии:

1. Моя версия Delayed_Jobs выдает следующее, когда я вызываю enqueue так, как у вас есть выше: [УСТАРЕВАНИЕ] Передача нескольких аргументов #enqueue устарела. Передайте хэш с помощью :priority и :run_at . Похоже, что он начинает принимать только хэш параметров.