Railsアプリでsidekiqを使用しています。私のアプリのユーザーはsidekiqジョブを開始するレポートを作成します。ただし、ユーザーはレポートの「処理」をキャンセルしたい場合があります。しかし、sidekiqジョブも削除できる必要があります。
これまでのところ、次のような労働者のリストを取得できました。
workers = Sidekiq::Workers.new
各ワーカーには、どのジョブがどのレポートに属しているかを特定できるように、report_idを含む引数があります。ただし、実際にジョブを削除する方法がわかりません。現在ビジーであるか、再試行に設定されているかにかかわらず、ジョブを削除することに注意してください。
これによると 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
これを行うために私が見つけた最も簡単な方法は次のとおりです。
job = Sidekiq::ScheduledSet.new.find_job([job_id])
[job_id]は、レポートに関連するJIDです。に続く:
job.delete
ここで他の回答で説明されているように、キュー全体を繰り返す必要はありませんでした。
私は同じ問題を抱えていましたが、違いは、スケジュールされたジョブをキャンセルする必要があることであり、私の解決策は次のとおりです。
Sidekiq::ScheduledSet.new.each do |_job|
next unless [online_jid, offline_jid].include? _job.jid
status = _job.delete
end
ワーカークラスと引数で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)
スケジュールされたジョブをキャンセルしたい場合、@ KimiGaoの答えはわかりませんが、これはSidekiqの現在のAPIドキュメントから適応したものです。
jid = MyCustomWorker.perform_async
r = Sidekiq::ScheduledSet.new
jobs = r.select{|job| job.jid == jid }
jobs.each(&:delete)
それが役に立てば幸い。
同じ問題がありました。初期化時にジョブ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'
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