我 在 Rails 中找到了这个 Schedule one-time 作业, 但这仅显示了如何安排 one-time。我有兴趣安排一个经常性的工作。
Delayed_job 有这个
self.delay(:run_at => 1.minute.from_now)
我如何在 Rails 4.2/Active Job 中做类似的事情?
我 在 Rails 中找到了这个 Schedule one-time 作业, 但这仅显示了如何安排 one-time。我有兴趣安排一个经常性的工作。
Delayed_job 有这个
self.delay(:run_at => 1.minute.from_now)
我如何在 Rails 4.2/Active Job 中做类似的事情?
类似于 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
如果您想将作业执行延迟到 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 (无论何时)。
如果你使用 Heroku,只需放入 SomeJob.perform_now(record)
一个预定的 rake 任务。请在此处阅读有关预定 rake 任务的更多信息:Heroku 调度程序。
您可以在执行结束时重新排队作业
class MyJob < ActiveJob::Base
RUN_EVERY = 1.hour
def perform
# do your thing
self.class.perform_later(wait: RUN_EVERY)
end
end
If you're using resque as your ActiveJob backend, you can use a combination of resque-scheduler's Scheduled Jobs and active_scheduler (https://github.com/JustinAiken/active_scheduler, which wraps the scheduled jobs to work properly with ActiveJob).