私はこれを見つけました Railsで1回限りのジョブをスケジュールする ですが、これは1回限りのスケジュールを示しています。定期的な仕事のスケジュールに興味があります。
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分後に遅らせたい場合、2つのオプション:
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)
をスケジュールされたrakeタスクに入れるだけです。スケジュールされたrakeタスクの詳細については、こちらをご覧ください: Heroku scheduler 。
実行の最後にジョブを再エンキューできます
class MyJob < ActiveJob::Base
RUN_EVERY = 1.hour
def perform
# do your thing
self.class.perform_later(wait: RUN_EVERY)
end
end
ActiveJobバックエンドとしてresqueを使用している場合、resque-schedulerのScheduled Jobsとactive_schedulerの組み合わせを使用できます( https://github.com/JustinAiken/active_scheduler 。これは、スケジュールされたジョブをActiveJobで適切に動作します)。