ruby-on-rails - the - riendas del destrero de la muerte carmesi
Borrar la cola del lateral (5)
Tengo este trabajador que corre para siempre.
class Worker
include Sidekiq::Worker
sidekiq_options queue: "infinity", retry: true
def perform(params)
# ...
self.class.perform_in(30.seconds, params)
end
end
El problema es que yo cargué trabajadores en el arranque, como este. config/initializers/load_workers.rb
Rails.application.config.after_initialize do
if ENV["SIDEKIQ"] == "1"
Worker.perform_async({})
end
end
Usando esto para iniciar sidekiq SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml
.
Esto significa que los trabajadores antiguos se detienen, tanto los que se están ejecutando actualmente como los que están siendo reprogramados.
Intenté ejecutar esto en el inicio (justo antes de cargar nuevos trabajos), pero no funcionó.
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)
Después de las implementaciones 5-ish, hay un montón de trabajadores duplicados en la cola programada para más adelante. Entonces, ¿hay una manera de borrar todo en una cola e impedir que se reprogramen los trabajos en ejecución?
Estoy usando sidekiq 3.0.
Elimina todos los trabajos en una cola, eliminando la cola.
require ''sidekiq/api'' # for the case of rails console
Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Esto hizo el truco para mí:
Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear
Funciona para mí para la mayoría de las versiones de sidekiq
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Borrar estadísticas (opcional)
Sidekiq::Stats.new.reset
Para eliminar todos los trabajos en cola. Vaya a la consola de Rails de su servidor de producción y simplemente ejecute este comando:
Sidekiq::Queue.new.clear
Matará a todos los trabajos en cola en sidekiq.
Puede borrar su cola ejecutando este código aunque habría métodos integrados.
queue = Sidekiq::Queue.new
queue.each do |job|
job.delete
end