Delayed_job — Выполняет устаревший код?
-
21-09-2019 - |
Вопрос
Я использую Delayed_job (пробовал как Tobi, так и Collective_idea) на общем хостинге site5.com со средой Passenger as Rails.Мне удалось выполнить работу.Однако кажется, что плагин игнорирует любые изменения в исходном коде класса задания после первого запуска.Я перезапускал сервер при каждом изменении (touch tmp/restart.txt
), но он все равно игнорирует это.
Пример:
файл: lib/xx_job.rb
class XxJob
def perform
Rails.logger.info "XX START"
TempTest.delete_all
i = 0
10.times {
i+=1
TempTest.create(:name => "XXX")
sleep(1)
}
Rails.logger.info "XX END"
end
end
В простом контроллере я вызываю:
Delayed::Job.enqueue(XxJob.new)
Выводы, которые я сделал:
- Если я изменю xx_job.rb на xx_job1.rb - ошибка на контроллере
- Если я изменю класс XxJob на класс XxJob1 - ошибка на контроллере
- Если я удалю все содержимое метода выполнения - будет выполнен старый код.
- Новый файл .rb с классом и выполнением, поставьте этот класс в очередь - работает отлично.
- Если я снова изменю что-то в задании выполнения и запуска этого нового файла - старый код будет выполнен.
Между каждым изменением я перезагружал сервер.Похоже, Passenger или что-то еще сохраняет кеш классов.
Как мне удалить этот кэш?Хранится где-нибудь на сервере?(Надеюсь, у меня есть к нему доступ с общего хостинга)
Спасибо!
Решение 2
В конце концов я это понял — в фоновом режиме работало несколько воркеров, каждый из них ловил задание и имел свой кеш.Я не знал, как их убить, поэтому на несколько секунд изменил название стола.Это их убило :)
Затем я использовал https://github.com/tobi/delayed_job/wiki/Running-Delayed::Worker-as-a-daemon как рабочий старт, и работает отлично.
Другие советы
Если вы запускаете демонизированные воркеры с отложенными заданиями, вам необходимо перезапустить их, чтобы перезагрузить код.Также имейте в виду, что каждый рабочий загружает свой собственный экземпляр рельсов.