web-dev-qa-db-ja.com

sidekiqキューをクリア

私は永遠に走るこの労働者を持っています。

class Worker
  include Sidekiq::Worker
  sidekiq_options queue: "infinity", retry: true

  def perform(params)
    # ...
    self.class.perform_in(30.seconds, params)
  end
end

問題は、このように起動時にワーカーをロードすることです。 config/initializers/load_workers.rb

Rails.application.config.after_initialize do  
  if ENV["SIDEKIQ"] == "1"
    Worker.perform_async({})
  end
end

これを使用してsidekiq SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.ymlを開始します。

これは、古いワーカーが停止することを意味します。現在実行中のワーカーと再スケジュールされているワーカーの両方です。

起動時に(新しい作品をロードする直前に)実行しようとしましたが、うまくいきませんでした。

q = []
q += Sidekiq::RetrySet.new.select { |job| job.klass.match(/Worker/) }
q += Sidekiq::Queue.new("infinity").select { |job| job.klass.match(/Worker/) }
q += Sidekiq::ScheduledSet.new.select { |job| job.klass.match(/Worker/) }
q.each(&:delete)

5-ishがデプロイされた後、キューには多数の重複するワーカーが後でスケジュールされます。だから、1つのキューのすべてをクリアし、すでに実行中のジョブが再スケジュールされるのを防ぐ方法はありますか?

Sidekiq 3.0を使用しています。

69
Oleander

キューを削除して、キュー内のすべてのジョブを削除します。

require 'sidekiq/api' # for the case of Rails console

Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
131

これは私のためにトリックをしました:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear
46
iGEL

ほとんどのsidekiqバージョンで動作します:

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

統計のクリア(オプション)

Sidekiq::Stats.new.reset
17
rusllonrails