清除sidekiq队列

时间:2014-04-17 21:27:24

标签: ruby-on-rails 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部署之后,队列中有大量重复的工作程序安排在稍后。那么,有没有办法清除一个队列中的每个队列并阻止已经重新安排的作业?

我正在使用sidekiq 3.0。

5 个答案:

答案 0 :(得分:124)

删除队列,删除队列中的所有作业。

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

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

答案 1 :(得分:33)

这对我有用:

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

答案 2 :(得分:16)

适用于大多数sidekiq版本:

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

清除统计信息(可选)

Sidekiq::Stats.new.reset

答案 3 :(得分:-1)

尽管有内置方法,您也可以通过运行此代码来清除队列。

queue = Sidekiq::Queue.new
queue.each do |job|
  job.delete 
end

答案 4 :(得分:-5)

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

 Sidekiq::Queue.new.clear

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