Mam tego pracownika, który działa wiecznie.
class Worker
include Sidekiq::Worker
sidekiq_options queue: "infinity", retry: true
def perform(params)
# ...
self.class.perform_in(30.seconds, params)
end
end
Problem w tym, że ładuję pracowników podczas uruchamiania, w ten sposób. config/initializers/load_workers.rb
Rails.application.config.after_initialize do
if ENV["SIDEKIQ"] == "1"
Worker.perform_async({})
end
end
Używanie tego do uruchomienia sidekiq SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml
.
Oznacza to, że starzy pracownicy co do zatrzymania, zarówno ci aktualnie pracujący, jak i ci, których harmonogram się zmienia.
Próbowałem uruchomić to podczas uruchamiania (tuż przed załadowaniem nowych prac), ale to nie zadziałało.
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)
Po pięciu wdrożeniach w kolejce zaplanowanej na później znajduje się grupa zduplikowanych pracowników. Czy jest więc sposób, aby wyczyścić wszystko w jednej kolejce i zapobiec zmianie harmonogramu już uruchomionych zadań?
Używam sidekiq 3.0.
ruby-on-rails
sidekiq
Linus Oleander
źródło
źródło
Odpowiedzi:
Usuwa wszystkie zadania w kolejce, usuwając kolejkę.
require 'sidekiq/api' # for the case of rails console Sidekiq::Queue.new("infinity").clear Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear
źródło
Sidekiq::Stats.new.reset
, okazało się, że to pomagaSidekiq::Queue.all.first.clear
Sidekiq::Queue.all.each &:clear
To załatwiło sprawę dla mnie:
Sidekiq::Queue.all.each(&:clear) Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear Sidekiq::DeadSet.new.clear
źródło
kill
podobnego poleceniarequire 'sidekiq/api'
pracować na konsoli.Działa dla mnie dla większości wersji sidekiq:
Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear
Przejrzyste statystyki (opcjonalnie)
Sidekiq::Stats.new.reset
źródło
Możesz wyczyścić kolejkę, uruchamiając ten kod, chociaż byłyby wbudowane metody.
queue = Sidekiq::Queue.new queue.each do |job| job.delete end
źródło