このSchedule one-time jobs in Railsを見つけまし たが、これは1回限りのスケジュール方法を示しています。定期的なジョブのスケジューリングに興味があります。
Delayed_jobにはこれがあります
self.delay(:run_at => 1.minute.from_now)
Rails 4.2/Active Job でそのようなことを行うにはどうすればよいですか?
このSchedule one-time jobs in Railsを見つけまし たが、これは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 ( when )を入れるだけです。
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
resque を ActiveJob バックエンドとして使用している場合は、resque-scheduler のスケジュールされたジョブと active_scheduler ( https://github.com/JustinAiken/active_scheduler、ActiveJob で適切に動作するようにスケジュールされたジョブをラップする) の組み合わせを使用できます。