#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 . Похоже, что он начинает принимать только хэш параметров.