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.
ruby-on-rails
sidekiq
Linus Oleander
fonte
fonte
Respostas:
Exclui todos os trabalhos em uma fila, removendo a fila.
require 'sidekiq/api' # for the case of rails console Sidekiq::Queue.new("infinity").clear Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear
fonte
Sidekiq::Stats.new.reset
, descobri que isso ajudaSidekiq::Queue.all.first.clear
Sidekiq::Queue.all.each &:clear
Isso funcionou para mim:
Sidekiq::Queue.all.each(&:clear) Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear Sidekiq::DeadSet.new.clear
fonte
kill
um comando semelhanterequire 'sidekiq/api'
no console para funcionar.Funciona para mim para a maioria das versões sidekiq:
Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear
Limpar estatísticas (opcional)
Sidekiq::Stats.new.reset
fonte
Você pode limpar sua fila executando este código, embora haja métodos embutidos.
queue = Sidekiq::Queue.new queue.each do |job| job.delete end
fonte