43

在 Rails 中找到了这个 Schedule one-time 作业, 但这仅显示了如何安排 one-time。我有兴趣安排一个经常性的工作。

Delayed_job 有这个

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

我如何在 Rails 4.2/Active Job 中做类似的事情?

4

4 回答 4

29

类似于 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

活动作业回调

于 2015-01-15T01:40:26.593 回答
28

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

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

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

延迟到从现在开始使用的特定时刻wait_until

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

  2. 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 调度程序

于 2015-01-03T17:07:59.487 回答
11

您可以在执行结束时重新排队作业

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

  def perform
    # do your thing

    self.class.perform_later(wait: RUN_EVERY)
  end
end
于 2014-12-06T15:54:24.073 回答
3

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).

于 2015-04-11T18:26:27.877 回答