web-dev-qa-db-fra.com

Comment planifier des travaux récurrents dans Active Job (Rails 4.2)?

J'ai trouvé cela Planifier des travaux ponctuels dans Rails mais cela ne montre que comment planifier un seul fois. Je souhaite planifier un travail récurrent.

Delayed_job a ceci

self.delay(:run_at => 1.minute.from_now)

Comment faire quelque chose comme ça dans Rails 4.2/Job actif?

35
luis.madrigal

Semblable à la réponse de rab3, puisque ActiveJob prend en charge les rappels, je pensais faire quelque chose comme

class MyJob < ActiveJob::Base
  after_perform do |job|
    # invoke another job at your time of choice 
    self.class.set(:wait => 10.minutes).perform_later(job.arguments.first)
  end

  def perform(the_argument)
    # do your thing
  end
end

rappels actifs

24
omencat

Si vous souhaitez retarder l'exécution du travail à 10 minutes plus tard, deux options:

  1. SomeJob.set(wait: 10.minutes).perform_later(record)

  2. SomeJob.new(record).enqueue(wait: 10.minutes)

Retardez à un moment précis à partir de maintenant, utilisez wait_until.

  1. SomeJob.set(wait_until: Date.tomorrow.noon).perform_later(record)

  2. SomeJob.new(record).enqueue(wait_until: Date.tomorrow.noon)

Pour plus de détails, veuillez vous reporter à http://api.rubyonrails.org/classes/ActiveJob/Base.html .

Pour les travaux récurrents, il vous suffit de mettre SomeJob.perform_now(record) dans un cronjob ( à chaque fois ).

Si vous utilisez Heroku, placez simplement SomeJob.perform_now(record) dans une tâche de râteau planifiée. Veuillez en savoir plus sur la tâche de râteau planifiée ici: Planificateur Herok .

23
Juanito Fatas

Vous pouvez simplement re-mettre en file d'attente le travail à la fin de l'exécution

class MyJob < ActiveJob::Base
  RUN_EVERY = 1.hour

  def perform
    # do your thing

    self.class.perform_later(wait: RUN_EVERY)
  end
end
11
rafb3

Si vous utilisez resque comme backend ActiveJob, vous pouvez utiliser une combinaison des tâches planifiées de resque-scheduler et active_scheduler ( https://github.com/JustinAiken/active_scheduler , qui encapsule les tâches planifiées pour fonctionner correctement avec ActiveJob).

2
trans1t