web-dev-qa-db-ja.com

sidekiqでジョブを削除する方法

Railsアプリでsidekiqを使用しています。私のアプリのユーザーはsidekiqジョブを開始するレポートを作成します。ただし、ユーザーはレポートの「処理」をキャンセルしたい場合があります。しかし、sidekiqジョブも削除できる必要があります。

これまでのところ、次のような労働者のリストを取得できました。

workers = Sidekiq::Workers.new

各ワーカーには、どのジョブがどのレポートに属しているかを特定できるように、report_idを含む引数があります。ただし、実際にジョブを削除する方法がわかりません。現在ビジーであるか、再試行に設定されているかにかかわらず、ジョブを削除することに注意してください。

34
Matthew Berman

これによると Sidekiqドキュメントページ 単一のIDを持つジョブを削除するには、キューを反復処理し、.deleteを呼び出す必要があります。

queue = Sidekiq::Queue.new("mailer")
queue.each do |job|
  job.klass # => 'MyWorker'
  job.args # => [1, 2, 3]
  job.delete if job.jid == 'abcdef1234567890'
end

sidekiq-status というプラグインもあり、1つのジョブをキャンセルする機能を提供します

scheduled_job_id = MyJob.perform_in 3600
Sidekiq::Status.cancel scheduled_job_id #=> true
65
Simone Carletti

これを行うために私が見つけた最も簡単な方法は次のとおりです。

job = Sidekiq::ScheduledSet.new.find_job([job_id])

[job_id]は、レポートに関連するJIDです。に続く:

job.delete

ここで他の回答で説明されているように、キュー全体を繰り返す必要はありませんでした。

18
Rick

私は同じ問題を抱えていましたが、違いは、スケジュールされたジョブをキャンセルする必要があることであり、私の解決策は次のとおりです。

Sidekiq::ScheduledSet.new.each do |_job|
  next unless [online_jid, offline_jid].include? _job.jid
  status = _job.delete
end
15
KimiGao

ワーカークラスと引数でsidekiqジョブフィルタリングを削除できます。

class UserReportsWorker
  include Sidekiq::Worker
  def perform(report_id)
    # ...
  end
end


jobs = Sidekiq::ScheduledSet.new.select do |retri| 
  retri.klass == "UserReportsWorker" && retri.args == [42]
end
jobs.each(&:delete)
4
Michał Kurek

スケジュールされたジョブをキャンセルしたい場合、@ KimiGaoの答えはわかりませんが、これはSidekiqの現在のAPIドキュメントから適応したものです。

jid = MyCustomWorker.perform_async

r = Sidekiq::ScheduledSet.new
jobs = r.select{|job| job.jid == jid }
jobs.each(&:delete)

それが役に立てば幸い。

3
thekingoftruth

同じ問題がありました。初期化時にジョブIDを登録し、別の関数cancel!を作成して削除することで解決しました。

コードは次のとおりです。

after_enqueue do |job|
  sidekiq_job = nil

  queue = Sidekiq::Queue.new
  sidekiq_job = queue.detect do |j|
    j.item['args'][0]['job_id'] == job.job_id
  end

  if sidekiq_job.nil?
    scheduled = Sidekiq::ScheduledSet.new
    sidekiq_job = scheduled.detect do |j|
      j.item['args'][0]['job_id'] == job.job_id
    end
  end

  if sidekiq_job.present?
    booking = job.arguments.first
    booking.close_comments_jid = sidekiq_job.jid
    booking.save
  end
end


def perform(booking)
   # do something
end

def self.cancel!(booking)
  queue = Sidekiq::Queue.new
  sidekiq_job = queue.find_job(booking.close_comments_jid)

  if sidekiq_job.nil?
    scheduled = Sidekiq::ScheduledSet.new
    sidekiq_job = scheduled.find_job(booking.close_comments_jid)
  end

  if sidekiq_job.nil?
    # Report bug in my Bug Tracking tool
  else
    sidekiq_job.delete

  end
end

または、Railsサーバーでsidekiqページを使用できます。

たとえば、 http:// localhost:3000/sidekiq の場合、sidekiqジョブを停止/削除できます。

その前に、routes.rbを更新する必要があります。

require 'sidekiq/web'
mount Sidekiq::Web => '/sidekiq'
0
hobbydev

Job_idがわかっている場合、ジョブを削除する簡単な方法があります。

job = Sidekiq::ScheduledSet.new.find_job(job_id)
begin
  job.delete
rescue
  Rails.logger.error "Job: (job_id: #{job_id}) not found while deleting jobs."
end
0