Я столкнулся с чрезвычайно странной ошибкой с Resque.
- У меня работает 5 рабочих с одной очередью, ожидающих заданий.
- У меня есть 1 тип Resque worker: MediaAnalyzer
И вот самое странное в мире: иногда (да, ИНОГДА) resque не может найти класс MediaAnalyzer.
Почему иногда? Потому что иногда работа обрабатывается без каких-либо проблем. Еще несколько раз я получил uninitialized constant MediaAnalyzer
. Еще более странно, если я повторю задание через resque-web, через пару раз рабочий наконец будет найден и выполнен...
Все воркеры запускаются одинаково одной и той же командой (кроме путей PID и логов):
su -c "cd /myapp/current; bundle exec rake environment resque:work RAILS_ENV=production QUEUES=* BACKGROUND=yes PIDFILE=/myapp/current/tmp/pids/resque_worker.1.pid 2>&1 >> /myapp/shared/log/resque_worker.1.log" - rails
Примечание. Даже при запуске вручную на консоли в режиме переднего плана я продолжаю получать ту же ошибку.
Я даже пытался вручную загрузить класс с помощью задачи resque:setup:
task "resque:setup" => :environment do
require Rails.root.join("app/workers/media_analyzer").to_s
end
Это не вызывает ошибки, я могу после этого require
использовать все в классе, я могу выводить данные, чтобы эта задача rake действительно вызывалась... но resque продолжает давать сбой при загрузке этого класса позже.
Самая большая трудность заключается в том, что эта ошибка действительно случайна!
Вот вставка обратной трассировки исключения: http://pastebin.com/jy5UakB8
Пробовал с resque 2.0, та же проблема.
Если ты знаешь, что происходит, ты гений!