Sidekiq-Warteschlange löschen

88

Ich habe diesen Arbeiter, der für immer läuft.

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

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

Das Problem ist, dass ich Arbeiter beim Start so lade. config/initializers/load_workers.rb

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

Verwenden Sie diese Option, um sidekiq zu starten SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml .

Dies bedeutet, dass alte Arbeiter aufhören müssen, sowohl diejenigen, die gerade laufen, als auch diejenigen, die umgeplant werden.

Ich habe versucht, dies beim Start auszuführen (kurz bevor neue Werke geladen wurden), aber das hat nicht funktioniert.

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)

Nach 5-ish-Bereitstellungen befinden sich mehrere doppelte Mitarbeiter in der Warteschlange, die für später geplant sind. Gibt es also eine Möglichkeit, alles in einer Warteschlange zu löschen und zu verhindern, dass bereits ausgeführte Jobs neu geplant werden?

Ich benutze Sidekiq 3.0.

Linus Oleander
quelle
Möchten Sie eine Warteschlange oder einen geplanten Job löschen? oder besser gesagt, doppelte geplante Jobs.
Sabyasachi Ghosh
Ich möchte jede Spur eines Jobs löschen, bevor ich den neuen Worker lade.
Linus Oleander
ok hast dein Problem .. bedeutet, dass du alle geplanten Jobs löschen willst.
Sabyasachi Ghosh
@haSabyasachiGhosh Nein, ich möchte alles löschen, was mit einer Warteschlange zusammenhängt, nicht nur die geplanten Jobs. Mit anderen Worten; Fehlgeschlagene, laufende, in die Warteschlange gestellte und geplante Jobs sollten gelöscht werden.
Linus Oleander
Alle Hilfe ist hier - github.com/mperham/sidekiq/wiki/API
viks

Antworten:

155

Löscht alle Jobs in einer Warteschlange, indem die Warteschlange entfernt wird.

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

Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Ranjithkumar Ravi
quelle
Möglicherweise hilft Ihnen Sidekiq Pro .
Ranjithkumar Ravi
5
Hier ist, um die Zähler zu löschen Sidekiq::Stats.new.resetIch finde heraus, dass dies hilft
14
So löschen Sie die Standard- / erste Warteschlange:Sidekiq::Queue.all.first.clear
user456584
1
Mit Sidekiq :: Queue.new ("Berichte"). Clear und Sidekiq :: Queue.new ("Warnungen"). Clear können Sie die aktuelle Warteschlange löschen. Aber was ist mit Busy? Wie lösche ich die "Besetzt" -Jobs?
Donato
31
Löschen Sie sie alle mitSidekiq::Queue.all.each &:clear
Marco Lazzeri
92

Das hat den Trick für mich getan:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear
iGEL
quelle
1
Dank dies funktionierte wie ein Zauber, ich war in einem Notfall haha, der Kumpel war mit waaaaaay zu viele Arbeiter in der Warteschlange dies funktionierte wie ich erwartet hatte, da ich nach einem killBefehl suchte
d1jhoni1b
Perfekt, nur um hinzuzufügen, dass ich in meiner Umgebung require 'sidekiq/api'auf der Konsole arbeiten musste.
Bonafernando
19

Funktioniert für mich für die meisten Sidekiq-Versionen:

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

Statistiken löschen (optional)

Sidekiq::Stats.new.reset
Rusllonrails
quelle
Dadurch wird die gesamte Datenbank geleert, nicht nur die Warteschlange.
Linus Oleander
if wird die gesamte Datenbank von sidekiq leeren und in der Rails-Konsole
einwandfrei funktionieren
-2

Sie können Ihre Warteschlange löschen, indem Sie diesen Code ausführen, obwohl integrierte Methoden vorhanden wären.

queue = Sidekiq::Queue.new
queue.each do |job|
  job.delete 
end
Asad Hameed
quelle
Nun, das sollte funktionieren, da wir alle Jobs aus der Warteschlange abgerufen und sie dann nacheinander gelöscht haben.
Asad Hameed
Nein, tut es nicht. Schauen Sie sich die vorhandenen Antworten an. Es ist auch ein Duplikat der vorhandenen Antwort.
Linus Oleander
Ich weiß nicht, wovon du redest. Können Sie mir bitte die gleiche Antwort zeigen, die ich gepostet habe?
Asad Hameed