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.