5

ActiveJob バックエンドとして Rails 4.2 とdelayed_job 4.0.6 を使用しています。

キューに 1 回だけ入れたいジョブがあります。問題のジョブの実行には 1 分以上かかります。モデルのコールバックによってキューに入れられます。コールバックは、ジョブが完了するよりもはるかに頻繁に発生します。今後、ジョブを複数回キューに入れる必要はありません。

これは、私が達成しようとしていることの擬似コードです。

# app/jobs/refresh_account_cache_job.rb
class RefreshAccountCacheJob < ActiveJob::Base
  def before_enqueue
    skip if job_already_enqueued
  end

  def perform
    Account.write_to_cache
  end

  def job_already_enqueued
    # ?
  end
end

再度呼び出されたときにジョブのインスタンスが実行されている場合は、将来のために引き続きキューに入れておく必要があります。将来の実行のためにジョブを最大1回キューに入れる方法を探しています。

答えはdelayed_jobに固有のものでなければならないと思いますが、ActiveJobに一般化できればさらに良いでしょう。

4

2 に答える 2

2

これは正確ではないかもしれませんが、正しい方向に向けられるはずです:

def self.up
  create_table :delayed_jobs, :force => true do |table|
  table.integer  :priority, :default => 0, :null => false
  table.integer  :attempts, :default => 0, :null => false
  table.text     :handler,                 :null => false
  table.text     :last_error
  table.datetime :run_at
  table.datetime :locked_at
  table.datetime :failed_at
  table.string   :locked_by
  table.string   :queue
  table.timestamps
end

したがって、そのテーブルにステータス列を追加してから、このようなクエリを実行してジョブを取得し、他の処理を行う前にそのステータスを確認できます。

Delayed::Job.where(queue: '<YOUR QUEUE>').where(id: params[:id]).status

ステータスをどのように設定しますか?さて、遅延ジョブで成功フックを使用してください。次のようになります。

def success(job)
  update_status('success')
end

private

def update_status(status)
  job = Job.find job_id
  job.status = status
  job.save!
end

お役に立てれば!

于 2015-03-03T21:45:22.790 に答える