如何在Active Job(Rails 4.2)中安排定期作业?

时间:2014-09-11 22:33:04

标签: ruby-on-rails ruby-on-rails-4 rails-activejob

我找到了Schedule one-time jobs in Rails 但这只能说明如何安排一次性。我有兴趣安排一份经常性的工作。

Delayed_job有这个

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

如何在Rails 4.2 / Active Job中执行类似的操作?

4 个答案:

答案 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

activejob callbacks

答案 1 :(得分:23)

如果您想将作业执行延迟到10分钟后,有两个选项:

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

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

  3. 从现在起延迟到特定时刻使用wait_until

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

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

    3. 详情请参阅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一起正常工作)。