rails method different content_for collection and ruby-on-rails ruby-on-rails-4 rails-activejob

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:

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

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

Retraso en un momento específico a partir de ahora use wait_until .

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

  2. 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

devoluciones de llamada activa