37 votes

Comment annuler un travail planifié avec delay_job dans Rails?

Je programme un travail à exécuter dans 10 minutes. Comment annuler correctement ce travail particulier sans utiliser aucun type de champs supplémentaires encrassés dans le modèle, etc. Existe-t-il un appel à supprimer un travail particulier ou des travaux liés à un modèle, une instance, etc. spécifique?

53voto

house9 Points 9240

disclaimer: je ne suis pas un expert de l'utilisateur de delayed_job...

"Est-il un appel à la suppression de poste, ou les emplois liés au modèle spécifique, exemple, etc?"

Différés::Travail est juste un ActiveRecord objet de sorte que vous pouvez trouver et détruire l'un de ces enregistrements. En fonction de votre cas d'utilisation, ce pourraient être traitées de différentes façons. Si quelqu'un va à la manuellement détruire ce qui pourrait être gérée par le biais d'une interface d'administration de votre application web.

# list all jobs
Delayed::Job.all
# find a job by id
job = Delayed::Job.find(params[:id])
# delete it
job.delete

si vous avez besoin de processus de tâche de suppression d'emplois par "type d'emploi" on peut faire une boucle par chacun et de la supprimer si elle correspond à votre travail; essayez ceci dans le script/console

class MyJob < Struct.new(:some_value);
    def perform
        # ...
    end
end

my_job = MyJob.new('xyz')
job = Delayed::Job.enqueue(my_job, 0, 1.hour.from_now)
job.name
# => "MyJob"
job.handler
# => "--- !ruby/struct:MyJob \nsome_value: xyz\n"

donc, étant donné ce qui précède, si vous vouliez supprimer tous les travaux de type MyJob

Delayed::Job.all do |job|
    if job.name == "MyJob" then
        job.delete
    end
end

cela peut ou peut ne pas aider votre situation? dans de nombreux cas, vous voudrez peut-être supprimer un MyJob mais seulement lorsque l' :some_value attribut a 'abc' et pas 'xyz'. Dans ce cas, vous pourriez avoir besoin pour mettre en œuvre un "display_name" sur votre MyJob objet. travail.nom de l'utiliser si elle existe

class MyJob < Struct.new(:user_id);
    def perform
        # ...
    end

    def display_name
        return "MyJob-User-#{user_id}"
    end 
end

# store reference to a User
my_job = MyJob.new(User.first.id) # users.id is 1
job = Delayed::Job.enqueue(my_job, 0, 1.hour.from_now)
job.name
# => "MyJob-User-1"
job.handler
# => "--- !ruby/struct:MyJob \nuser_id: 1\n"

de cette façon, vous pourriez être plus sélectif sur les enregistrements à supprimer?

j'espère que cela vous donne assez d'informations sur les possibilités de façons de le gérer?

7voto

firien Points 879

delay_job 3 a introduit un attribut queue . Cela peut être détourné pour planifier un travail annulable.

 class MyJob < Struct.new(:user_id)
  def self.queue_name
    "something-unique"
  end

  def perform
    # ...
  end
end

#scheduler
my_job = MyJob.new(User.first.id)
#'cancel' pending jobs first
Delayed::Job.where(queue: my_job.class.queue_name).destroy_all
#queue it up
Delayed::Job.enqueue(my_job,
  queue: my_job.class.queue_name,
  run_at: 1.hour.from_now
)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X