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?
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
Si vous souhaitez retarder l'exécution du travail à 10 minutes plus tard, deux options:
SomeJob.set(wait: 10.minutes).perform_later(record)
SomeJob.new(record).enqueue(wait: 10.minutes)
Retardez à un moment précis à partir de maintenant, utilisez wait_until
.
SomeJob.set(wait_until: Date.tomorrow.noon).perform_later(record)
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 .
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
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).