web-dev-qa-db-fra.com

Relancer manuellement le travail dans Delayed_job

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.

55
Michael Waxman

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
92
The Who
Delayed::Worker.new.run(Delayed::Job.last)

Cela supprimera le travail une fois terminé.

24
Beena Shetty

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.

11
Joe Martinez

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
8
Tony

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!
6
jpwynn

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!}
4
Darme

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
4
mohamed-ibrahim
Delayed::Job.all.each(&:invoke_job)
2
rubycop

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. 

0
Blair Anderson