Подтвердить что ты не робот

Как назначить повторяющиеся задания в Active Job (Rails 4.2)?

Я нашел это Расписание одноразовых заданий в Rails но это показывает только однократное расписание. Я заинтересован в планировании повторяющейся работы.

Delayed_job имеет этот

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

Как мне сделать что-то подобное в Rails 4.2/Active Job?

4b9b3361

Ответ 1

Если вы хотите отложить выполнение задания до 10 минут позже, два варианта:

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

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

Задержка в определенный момент теперь использует wait_until.

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

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

Подробнее см. http://api.rubyonrails.org/classes/ActiveJob/Base.html.

Для повторяющихся заданий вы просто кладете SomeJob.perform_now(record) в cronjob (whenever).

Если вы используете Heroku, просто поместите SomeJob.perform_now(record) в запланированную задачу рейка. Подробнее о запланированной рейк-задаче читайте здесь: планировщик Heroku.

Ответ 2

Как и в случае с ответом rab3, поскольку ActiveJob поддерживает обратные вызовы, я думал сделать что-то вроде

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

активные обратные вызовы

Ответ 3

Вы можете просто повторно присвоить задание в конце выполнения

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

  def perform
    # do your thing

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

Ответ 4

Если вы используете resque в качестве активного компонента ActiveJob, вы можете использовать комбинацию планировщика расписаний Scheduled Jobs и active_scheduler (https://github.com/JustinAiken/active_scheduler, который завершает запланированные задания для правильной работы с ActiveJob).