Как назначить повторяющиеся задания в Active Job (Rails 4.2)?
Я нашел это Расписание одноразовых заданий в Rails
но это показывает только однократное расписание. Я заинтересован в планировании повторяющейся работы.
Delayed_job имеет этот
self.delay(:run_at => 1.minute.from_now)
Как мне сделать что-то подобное в Rails 4.2/Active Job?
Ответы
Ответ 1
Если вы хотите отложить выполнение задания до 10 минут позже, два варианта:
Задержка в определенный момент теперь использует wait_until
.
Подробнее см. 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).