4

バックグラウンドでdelayed_job(4.0.6)でActiveJobを使用しており、スケジュールされたジョブを見つけて削除したいと考えています。

たとえば、私が持っている場合

class MyClass

  def my_method
    perform_stuff
    MyJob.set(wait: 1.month.from_now).perform_later(current_user)
  end
end

次に、MyClass インスタンスを編集して my_method を再度呼び出した場合、そのジョブをキャンセルして新しいジョブをスケジュールします。

この投稿http://www.sitepoint.com/delayed-jobs-best-practicesで提案されているように、遅延ジョブ テーブルに 2 つの列を追加しました。

table.integer :delayed_reference_id
table.string  :delayed_reference_type

add_index :delayed_jobs, [:delayed_reference_id],   :name => 'delayed_jobs_delayed_reference_id'
add_index :delayed_jobs, [:delayed_reference_type], :name => 'delayed_jobs_delayed_reference_type'

このようにして、遅延したジョブを見つけて破棄することができます。しかし、プロジェクト内のジョブのパターンを維持するために、ActiveJob クラス内でそれを行いたかったのです。

私は次のようなことをしたかった:

class MyJob < ActiveJob::Base

  after_enqueue do |job|
    user = self.arguments.first
    job.delayed_reference_id = user.id,
    job.delayed_reference_type = "User" 
  end

  def perform(user)
    delete_previous_job_if_exists(user_id)
  end

  def delete_previous_job_if_exists(user_id)
    Delayed::Job.find_by(delayed_reference_id: 1, delayed_reference_type: 'User').delete
  end
end

しかし、それはうまくいきません。

誰もこの種の問題を抱えていましたか?

4

1 に答える 1

2

2 つの変更点: 1. after_enqueue コールバックを更新して、delayed_jobs テーブルを直接更新できるようにしました 2. delayed_reference_id1 としてハードコードされたタイプミスを修正しました

これはうまくいくはずです:

class MyJob < ActiveJob::Base

  after_enqueue do |job|
    user = self.arguments.first
    delayed_job = Delayed::Job.find(job.provider_job_id)
    delayed_job.update(delayed_reference_id:user.id,delayed_reference_type:'User')
 end

  def perform(user)
    delete_previous_job_if_exists(user.id)
  end

  def delete_previous_job_if_exists(user_id)
    Delayed::Job.find_by(delayed_reference_id: user_id, delayed_reference_type: 'User').delete
  end
end
于 2016-11-03T16:59:57.387 に答える