Tenho esse trabalhador que funciona para sempre.
class Worker
include Sidekiq::Worker
sidekiq_options queue: "infinity", retry: true
def perform(params)
# ...
self.class.perform_in(30.seconds, params)
end
end
O problema é que eu carrego trabalhadores na inicialização, assim. config/initializers/load_workers.rb
Rails.application.config.after_initialize do
if ENV["SIDEKIQ"] == "1"
Worker.perform_async({})
end
end
Usando isso para iniciar o sidekiq SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml
.
Isso significa que os trabalhadores antigos devem parar, tanto os que estão em execução, mas também os que estão sendo reprogramados.
Tentei executar isso na inicialização (antes de carregar novos trabalhos), mas não funcionou.
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)
Após as implantações 5-ish, há um monte de trabalhadores duplicados na fila agendados para mais tarde. Portanto, há uma maneira de limpar tudo em uma fila e evitar que trabalhos já em execução sejam reprogramados?
Estou usando o sidekiq 3.0.