清除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

这意味着老工人要停下来,不pipe是现在正在运行的那些工人,还是那些正在重新安排的人。

我尝试在启动时运行(在加载新作品之前),但是没有奏效。

 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) 

五人部署之后,队列中会有大量重复的工作人员排队等候。 那么,是否有办法清除一个队列中的所有内容,并防止重新计划已经运行的工作?

我使用的是sidekiq 3.0。

通过删除队列删除队列中的所有作业。

 require 'sidekiq/api' # for the case of rails console Sidekiq::Queue.new("infinity").clear Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear 

适用于大多数sidekiq版本的我:

 Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear 

清除统计信息(可选)

 Sidekiq::Stats.new.reset 

这为我做了诡计:

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

为了删除所有排队的作业。 转到生产服务器的rails控制台,只需运行以下命令:

  Sidekiq::Queue.new.clear 

它会杀死所有在sidekiq排队的作业。