Limpar fila sidekiq


97

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.


Você deseja excluir uma fila ou um trabalho agendado. ou melhor, trabalho agendado duplicado.
Sabyasachi Ghosh

Quero excluir todos os vestígios de um trabalho antes de carregar o novo trabalhador.
Linus Oleander de

ok, entendi seu problema ... significa que você deseja excluir todos os trabalhos agendados.
Sabyasachi Ghosh

@haSabyasachiGhosh Não, quero excluir tudo relacionado a uma fila, não apenas os trabalhos agendados. Em outras palavras; trabalhos com falha, em andamento, enfileirados e programados devem ser excluídos.
Linus Oleander de

Toda a ajuda está aqui - github.com/mperham/sidekiq/wiki/API
viks

Respostas:


162

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

Pode ser que o Sidekiq Pro o ajude.
Ranjithkumar Ravi

5
Aqui é para limpar os contadores Sidekiq::Stats.new.reset, descobri que isso ajuda

14
Para limpar a fila padrão / primeira:Sidekiq::Queue.all.first.clear
user456584

1
O Sidekiq :: Queue.new ("relatórios"). Clear e Sidekiq :: Queue.new ("alertas"). Clear ajudam a limpar a fila atual. Mas e quanto ao Busy? Como limpo as tarefas "Ocupadas"?
Donato

32
Elimine todos comSidekiq::Queue.all.each &:clear
Marco Lazzeri

101

Isso funcionou para mim:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear

1
Obrigado, funcionou como um encanto, eu estava em uma emergência haha, o ajudante estava com waaaaaay muitos trabalhadores na fila isso funcionou como eu esperava, pois estava procurando por killum comando semelhante
d1jhoni1b

1
Perfeito, só adicionando isso no meu env eu precisava require 'sidekiq/api'no console para funcionar.
bonafernando

19

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

Isso libera todo o banco de dados, não apenas a fila.
Linus Oleander

se irá limpar todo o banco de dados do sidekiq e funcionará bem no console do Rails
vidur punj

-2

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

Bem, isso deve funcionar, pois buscamos todos os trabalhos da fila e, em seguida, os excluímos um por um.
Asad Hameed

Não, não faz. Dê uma olhada nas respostas existentes. Também é uma duplicata da resposta existente.
Linus Oleander,

Eu não sei do que você está falando. Você pode me mostrar a mesma resposta que postei?
Asad Hameed
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.