Effacer la file d'attente sidekiq


93

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.


Voulez-vous supprimer une file d'attente ou un travail planifié. ou mieux pour dire travail planifié en double.
Sabyasachi Ghosh

Je souhaite supprimer toutes les traces d'un travail avant de charger le nouveau travailleur.
Linus Oleander

ok obtenu votre problème .. signifie que vous souhaitez supprimer tous les travaux planifiés.
Sabyasachi Ghosh

@haSabyasachiGhosh Non, je veux supprimer tout ce qui est lié à une file d'attente, pas seulement les travaux planifiés. En d'autres termes; les travaux échoués, en cours, en attente et planifiés doivent être supprimés.
Linus Oleander

Toute l'aide est ici - github.com/mperham/sidekiq/wiki/API
viks

Réponses:


161

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

Peut-être que Sidekiq Pro vous aidera.
Ranjithkumar Ravi

5
Voici pour effacer les compteurs, Sidekiq::Stats.new.resetje découvre que cela aide

14
Pour effacer la file d'attente par défaut / première:Sidekiq::Queue.all.first.clear
user456584

1
Sidekiq :: Queue.new ("rapports"). Clear et Sidekiq :: Queue.new ("alertes"). Clear permet d'effacer la file d'attente actuelle. Mais qu'en est-il Busy? Comment effacer les tâches "Occupé"?
Donato

31
Effacez-les tous avecSidekiq::Queue.all.each &:clear
Marco Lazzeri

95

Cela a fait l'affaire pour moi:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear

1
Merci, cela a fonctionné comme un charme, j'étais dans une urgence haha, l'acolyte était avec waaaaaay trop de travailleurs dans la file d'attente cela a fonctionné comme je kill
m'y

Parfait, juste en ajoutant que dans mon env, je devais require 'sidekiq/api'travailler sur console.
bonafernando le

19

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

Cela vide toute la base de données, pas seulement la file d'attente.
Linus Oleander

si va vider toute la base de données de sidekiq, et fonctionnera bien dans la console rails
vidur punj

-2

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

Eh bien, cela devrait fonctionner car nous avons récupéré tous les travaux de la file d'attente, puis les avons supprimés un par un.
Asad Hameed

Non, ce n'est pas le cas. Jetez un œil aux réponses existantes. C'est aussi un double de la réponse existante.
Linus Oleander

Je ne sais pas de quoi tu parles. Pouvez-vous s'il vous plaît me montrer la même réponse que j'ai publiée?
Asad Hameed
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.