J'ai cet ouvrier qui court pour toujours.
class Worker
include Sidekiq::Worker
sidekiq_options queue: "infinity", retry: true
def perform(params)
# ...
self.class.perform_in(30.seconds, params)
end
end
Le problème est que je charge les ouvriers au démarrage, comme ça. config/initializers/load_workers.rb
Rails.application.config.after_initialize do
if ENV["SIDEKIQ"] == "1"
Worker.perform_async({})
end
end
Utiliser ceci pour démarrer sidekiq SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml
.
Cela signifie que les anciens travailleurs doivent s'arrêter, à la fois ceux en cours d'exécution mais aussi ceux en cours de rééchelonnement.
J'ai essayé de l'exécuter au démarrage (juste avant de charger de nouvelles œuvres), mais cela n'a pas fonctionné.
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)
Après les déploiements 5-ish, il y a un tas de travailleurs en double dans la file d'attente prévue pour plus tard. Alors, y a-t-il un moyen de vider tout dans une file d'attente et d'empêcher les travaux déjà en cours de replanifier?
J'utilise sidekiq 3.0.
la source
Réponses:
Supprime tous les travaux d'une file d'attente en supprimant la file d'attente.
require 'sidekiq/api' # for the case of rails console Sidekiq::Queue.new("infinity").clear Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear
la source
Sidekiq::Stats.new.reset
je découvre que cela aideSidekiq::Queue.all.first.clear
Sidekiq::Queue.all.each &:clear
Cela a fait l'affaire pour moi:
Sidekiq::Queue.all.each(&:clear) Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear Sidekiq::DeadSet.new.clear
la source
kill
require 'sidekiq/api'
travailler sur console.Fonctionne pour moi pour la plupart des versions de sidekiq:
Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear
Effacer les statistiques (facultatif)
Sidekiq::Stats.new.reset
la source
Vous pouvez effacer votre file d'attente en exécutant ce code bien qu'il y ait des méthodes intégrées.
queue = Sidekiq::Queue.new queue.each do |job| job.delete end
la source