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.


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

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

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

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.