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 cargo a los trabajadores al inicio, así. 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 viejos deben detenerse, tanto los que están actualmente en ejecución 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 cinco implementaciones, hay un montón de trabajadores duplicados en la cola programados para más adelante. Entonces, ¿hay alguna manera de borrar todo en una cola y evitar que los trabajos que ya están en ejecución se reprogramen?
Estoy usando sidekiq 3.0.
fuente
Respuestas:
Elimina todos los trabajos de 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
fuente
Sidekiq::Stats.new.reset
, descubrí que esto ayudaSidekiq::Queue.all.first.clear
Sidekiq::Queue.all.each &:clear
Esto funcionó para mí:
Sidekiq::Queue.all.each(&:clear) Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear Sidekiq::DeadSet.new.clear
fuente
kill
comando similarrequire 'sidekiq/api'
en la consola para trabajar.Me funciona para la mayoría de las versiones de sidekiq:
Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear
Estadísticas claras (opcional)
Sidekiq::Stats.new.reset
fuente
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
fuente