La fonction de nouvelle tentative automatique de Delayed :: Job est excellente, mais je souhaite maintenant réessayer manuellement une tâche. Y at-il une méthode que je peux appeler sur le travail lui-même comme ...
Delayed::Job.all[0].perform
ou courir, ou quelque chose. J'ai essayé quelques solutions et examiné la documentation, mais je ne savais pas comment exécuter une nouvelle tentative manuelle d'un travail.
Pour appeler manuellement un travail
Delayed::Job.find(10).invoke_job # 10 is the job.id
Cela ne supprime pas le travail s'il est exécuté correctement. Vous devez le supprimer manuellement:
Delayed::Job.find(10).destroy
Delayed::Worker.new.run(Delayed::Job.last)
Cela supprimera le travail une fois terminé.
Vous pouvez le faire exactement comme vous l'avez dit, en trouvant le travail et en cours d'exécution.
Cependant, ce que je fais généralement, c’est simplement que je redonne la valeur run_at au processeur de travaux.
J'ai une méthode dans un contrôleur à des fins de test qui réinitialise simplement toutes les tâches retardées lorsque je frappe une URL. Pas super élégant mais fonctionne très bien pour moi:
# 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
Les réponses précédentes ci-dessus peuvent être obsolètes. J'ai trouvé que je devais définir fail_at, locked_by et locked_at sur nil:
(pour chaque travail que vous souhaitez réessayer):
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!
Dans un environnement de développement, via Rails console
, suivant la suggestion de Joe Martinez, voici un bon moyen de relancer toutes vos tâches différées:
Delayed::Job.all.each{|d| d.run_at = Time.now; d.save!}
si vous avez échoué le travail retardé que vous devez ré-exécuter, il vous suffira de le sélectionner et de définir toutes les références sur les tentatives infructueuses sur 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
Delayed::Job.all.each(&:invoke_job)
Mettez ceci dans un fichier d'initialisation!
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
Ensuite, vous pouvez exécuter Delayed::Job.find(1234).retry!
Cela ramènera le travail dans la file d'attente et le traitera normalement.