J'ai ce travailleur 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 travailleurs au démarrage, comme ceci. config/initializers/load_workers.rb
Rails.application.config.after_initialize do
if ENV["SIDEKIQ"] == "1"
Worker.perform_async({})
end
end
En utilisant 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, tant ceux qui sont en cours d’emploi que ceux qui sont en train d’être reprogrammés.
J'ai essayé de l'exécuter au démarrage (juste avant de charger de nouveaux travaux), 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, un groupe de travailleurs en double dans la file d'attente est planifié pour plus tard. Alors, y a-t-il un moyen d'effacer tout dans une file d'attente et d'empêcher la replanification de tâches en cours d'exécution?
J'utilise sidekiq 3.0.
Supprime tous les travaux de la 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
Cela a fait le tour pour moi:
Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear
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