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.
quelle
Antworten:
Löscht alle Jobs in einer Warteschlange, indem die Warteschlange entfernt wird.
quelle
Sidekiq::Stats.new.reset
Ich finde heraus, dass dies hilftSidekiq::Queue.all.first.clear
Sidekiq::Queue.all.each &:clear
Das hat den Trick für mich getan:
quelle
kill
Befehl suchterequire 'sidekiq/api'
auf der Konsole arbeiten musste.Funktioniert für mich für die meisten Sidekiq-Versionen:
Statistiken löschen (optional)
quelle
Sie können Ihre Warteschlange löschen, indem Sie diesen Code ausführen, obwohl integrierte Methoden vorhanden wären.
quelle