ruby on rails - method - ¿Cómo programo trabajos recurrentes en Trabajo activo(Rails 4.2)?
ruby and rails documentation (4)
Encontré este Programar trabajos únicos en Rails, pero esto solo muestra cómo programarlo una sola vez. Estoy interesado en programar un trabajo recurrente.
Delayed_job tiene esto
self.delay(:run_at => 1.minute.from_now)
¿Cómo hago algo así en Rails 4.2 / Active Job?
Puede volver a poner en cola el trabajo al final de la ejecución
class MyJob < ActiveJob::Base
RUN_EVERY = 1.hour
def perform
# do your thing
self.class.perform_later(wait: RUN_EVERY)
end
end
Si desea retrasar la ejecución del trabajo a 10 minutos más tarde, dos opciones:
SomeJob.set(wait: 10.minutes).perform_later(record)
SomeJob.new(record).enqueue(wait: 10.minutes)
Retraso en un momento específico a partir de ahora use wait_until
.
SomeJob.set(wait_until: Date.tomorrow.noon).perform_later(record)
SomeJob.new(record).enqueue(wait_until: Date.tomorrow.noon)
Los detalles se refieren a http://api.rubyonrails.org/classes/ActiveJob/Base.html .
Para trabajos recurrentes, simplemente coloca SomeJob.perform_now(record)
en un cronjob ( github.com/javan/whenever ).
Si usa Heroku, simplemente ponga SomeJob.perform_now(record)
en una tarea de rake programada. Por favor, lea más acerca de la tarea de rake programada aquí: programador de Heroku .
Si usa resque como su backend de ActiveJob, puede usar una combinación de Trabajos programados de resque-scheduler y active_scheduler ( https://github.com/JustinAiken/active_scheduler , que ajusta los trabajos programados para que funcionen correctamente con ActiveJob).
Similar a la respuesta de rab3, ya que ActiveJob tiene soporte para devoluciones de llamadas, estaba pensando en hacer algo como
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