我找到了Schedule one-time jobs in Rails 但这只能说明如何安排一次性。我有兴趣安排一份经常性的工作。
Delayed_job有这个
self.delay(:run_at => 1.minute.from_now)
如何在Rails 4.2 / Active Job中执行类似的操作?
答案 0 :(得分:24)
类似于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
答案 1 :(得分:23)
如果您想将作业执行延迟到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 scheduler。
答案 2 :(得分:12)
您可以在执行结束时重新入队作业
class MyJob < ActiveJob::Base
RUN_EVERY = 1.hour
def perform
# do your thing
self.class.perform_later(wait: RUN_EVERY)
end
end
答案 3 :(得分:2)
如果您使用resque作为ActiveJob后端,则可以使用resque-scheduler的预定作业和active_scheduler(https://github.com/JustinAiken/active_scheduler的组合,它将预定作业包装为与ActiveJob一起正常工作)。