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.