web-dev-qa-db-ja.com

Active Job(Rails 4.2)で繰り返しジョブをスケジュールするにはどうすればよいですか?

私はこれを見つけました Railsで1回限りのジョブをスケジュールする ですが、これは1回限りのスケジュールを示しています。定期的な仕事のスケジュールに興味があります。

Delayed_jobにはこれがあります

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

Rails 4.2/Active Job?

35
luis.madrigal

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コールバック

24
omencat

ジョブの実行を10分後に遅らせたい場合、2つのオプション:

  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に入れるだけです( whenever )。

Herokuを使用する場合は、SomeJob.perform_now(record)をスケジュールされたrakeタスクに入れるだけです。スケジュールされたrakeタスクの詳細については、こちらをご覧ください: Heroku scheduler

23
Juanito Fatas

実行の最後にジョブを再エンキューできます

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

  def perform
    # do your thing

    self.class.perform_later(wait: RUN_EVERY)
  end
end
11
rafb3

ActiveJobバックエンドとしてresqueを使用している場合、resque-schedulerのScheduled Jobsとactive_schedulerの組み合わせを使用できます( https://github.com/JustinAiken/active_scheduler 。これは、スケジュールされたジョブをActiveJobで適切に動作します)。

2
trans1t