43

このSchedule one-time jobs in Railsを見つけまし たが、これは1回限りのスケジュール方法を示しています。定期的なジョブのスケジューリングに興味があります。

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 分後に遅らせたい場合は、次の 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 ( when )を入れるだけです。

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

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

于 2015-04-11T18:26:27.877 に答える