清除sidekiq队列


93

我有一个永远运转的工人。

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次部署之后,队列中会安排一堆重复的工作程序,以供以后使用。因此,是否有一种方法可以清除一个队列中的所有内容并防止已运行的作业重新计划?

我正在使用sidekiq 3.0。


您是否要删除队列或预定的作业。或者说重复的预定工作。
Sabyasachi Ghosh 2014年

我想在加载新工作程序之前删除作业的所有痕迹。
Linus Oleander 2014年

好的,您遇到了问题..意味着您要删除所有计划的作业。
Sabyasachi Ghosh 2014年

@haSabyasachiGhosh不,我要删除与队列相关的所有内容,而不仅仅是计划的作业。换一种说法; 失败,正在进行,排队和计划的作业应删除。
Linus Oleander 2014年

所有帮助都在这里-github.com/mperham/sidekiq/wiki/API
viks

Answers:


161

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

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

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

Sidekiq Pro可能会为您提供帮助。
Ranjithkumar Ravi 2014年

5
这是为了清除计数器,Sidekiq::Stats.new.reset我发现这对您

14
要清除默认/第一队列:Sidekiq::Queue.all.first.clear
user456584

1
Sidekiq :: Queue.new(“ reports”)。clear和Sidekiq :: Queue.new(“ alerts”)。clear有助于清除当前队列。但是忙呢?如何清除“忙”工作?
多纳托

31
清除他们所有Sidekiq::Queue.all.each &:clear
马可Lazzeri

95

这对我有用:

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

1
谢谢,这就像是一种魅力,我陷入了紧急状态哈哈,同伴与waaaaaay在一起,因为我一直在寻找kill类似的命令,所以队列中的工作如此多,正如我所期望的那样
d1jhoni1b,

完美,只需在我的环境中添加它,我就必须require 'sidekiq/api'在控制台上工作。
bonafernando

19

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

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

清除统计信息(可选)

Sidekiq::Stats.new.reset

这将刷新整个数据库,而不仅仅是队列。
Linus Oleander

如果将刷新sidekiq的所有数据库,并将在Rails控制台中正常工作
vidur punj

-2

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

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

好吧,这应该可行,因为我们从队列中获取了所有作业,然后将它们一个接一个地删除。
阿萨德·哈米德

不,不是。看一下现有的答案。它也是现有答案的重复。
莱纳斯·夹竹桃'18

我不知道你在说什么 你能给我看看我发布的答案吗?
阿萨德·哈米德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.