Вручную повторите задание в отложенном задании
Delayed:: функция автоматического повтора задания отличная, но есть задание, которое я хочу повторить вручную сейчас. Есть ли метод, который я могу вызвать на самой работе, как...
Delayed::Job.all[0].perform
или беги, или еще что-нибудь. Я попробовал несколько вещей и прочесал документацию, но не мог понять, как выполнить ручную попытку задания.
9 ответов:
чтобы вручную вызвать задание
Delayed::Job.find(10).invoke_job # 10 is the job.idэто не удаляет задание, если оно выполняется успешно. Вам нужно удалить его вручную:
Delayed::Job.find(10).destroy
вы можете сделать это именно так, как вы сказали, найдя работу и запустив perform.
однако то, что я обычно делаю, это просто установить run_at обратно, чтобы процессор заданий снова его поднял.
У меня есть метод в контроллере для целей тестирования, который просто сбрасывает все отложенные задания, когда я ударил URL-адрес. Не очень элегантный, но отлично работает для меня:
# For testing purposes def reset_all_jobs Delayed::Job.all.each do |dj| dj.run_at = Time.now - 1.day dj.locked_at = nil dj.locked_by = nil dj.attempts = 0 dj.last_error = nil dj.save end head :ok end
предыдущие ответы выше могут быть устаревшими. Я обнаружил, что мне нужно установить failed_at, locked_by и locked_at на ноль:
(для каждого задания нужно повторить):
d.last_error = nil d.run_at = Time.now d.failed_at = nil d.locked_at = nil d.locked_by = nil d.attempts = 0 d.failed_at = nil # needed in Rails 5 / delayed_job (4.1.2) d.save!
в среде разработки, через
rails console, следуя предложению Джо Мартинеса, хороший способ повторить все ваши отложенные задания:Delayed::Job.all.each{|d| d.run_at = Time.now; d.save!}
Если вы не выполнили отложенное задание, которое вам нужно повторно запустить, то вам нужно будет только выбрать их и установить все, что относится к неудачной попытке повтора в null:
Delayed::Job.where("last_error is not null").each do |dj| dj.run_at = Time.now.advance(seconds: 5) dj.locked_at = nil dj.locked_by = nil dj.attempts = 0 dj.last_error = nil dj.failed_at = nil dj.save end
поместите это в файл инициализатора!
module Delayed module Backend module ActiveRecord class Job def retry! self.run_at = Time.now - 1.day self.locked_at = nil self.locked_by = nil self.attempts = 0 self.last_error = nil self.failed_at = nil self.save! end end end end endзатем вы можете запустить
Delayed::Job.find(1234).retry!это будет в основном придерживаться задания обратно в очередь и обрабатывать его нормально.
Comments