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.