Sidekiq kuyruğunu temizle


93

Sonsuza dek çalışan bu işçiye sahibim.

class Worker
  include Sidekiq::Worker
  sidekiq_options queue: "infinity", retry: true

  def perform(params)
    # ...
    self.class.perform_in(30.seconds, params)
  end
end

Sorun şu ki, işçileri başlangıçta böyle yüklüyorum. config/initializers/load_workers.rb

Rails.application.config.after_initialize do  
  if ENV["SIDEKIQ"] == "1"
    Worker.perform_async({})
  end
end

Sidekiq'i başlatmak için bunu kullanmak SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml.

Bu, hem şu anda çalışan hem de yeniden planlanan eski işçilerin durması gerektiği anlamına gelir.

Bunu başlangıçta çalıştırmayı denedim (yeni çalışmalar yüklemeden hemen önce), ancak bu işe yaramadı.

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)

5 saniyelik konuşlandırmalardan sonra, kuyrukta daha sonra yapılması planlanan birçok yinelenen çalışan var. Öyleyse, tek bir kuyruktaki her şeyi temizlemenin ve zaten devam eden işlerin yeniden planlanmasını önlemenin bir yolu var mı?

Sidekiq 3.0 kullanıyorum.


Bir kuyruğu veya zamanlanmış bir işi silmek istiyor musunuz? veya yinelenen planlanmış iş demek daha iyidir.
Sabyasachi Ghosh

Yeni çalışanı yüklemeden önce bir işin her izini silmek istiyorum.
Linus Oleander

tamam problemin var .. demek tüm planlanmış işleri silmek istiyorsun.
Sabyasachi Ghosh

@haSabyasachiGhosh Hayır, sadece planlanan işleri değil, bir kuyrukla ilgili her şeyi silmek istiyorum. Diğer bir deyişle; başarısız, devam eden, sıraya alınan ve planlanan işler silinmelidir.
Linus Oleander

Tüm yardımlar burada - github.com/mperham/sidekiq/wiki/API
viks

Yanıtlar:


161

Sırayı kaldırarak Kuyruktaki tüm İşleri siler.

require 'sidekiq/api' # for the case of rails console

Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear

Olabilir Sidekiq Pro size yardımcı olacaktır.
Ranjithkumar Ravi

5
İşte sayaçları temizlemek için Sidekiq::Stats.new.resetbunun yardımcı olduğunu öğrendim

14
Varsayılan / ilk kuyruğu temizlemek için:Sidekiq::Queue.all.first.clear
user456584

1
Sidekiq :: Queue.new ("raporlar"). Clear ve Sidekiq :: Queue.new ("uyarılar"). Clear mevcut sırayı temizlemeye yardımcı olur. Peki ya Meşgul? "Meşgul" işlerini nasıl silebilirim?
Donato

31
Hepsini temizleyinSidekiq::Queue.all.each &:clear
Marco Lazzeri

95

Bu benim için hile yaptı:

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

1
Teşekkürler bu bir cazibe gibi çalıştı, acil bir haha ​​içindeydim, sidekick waaaaaay ile kuyrukta çok fazla işçi vardı, bu killkomut gibi bir komut aradığımdan beri beklediğim gibi çalıştı
d1jhoni1b

Mükemmel, sadece ortamıma require 'sidekiq/api'çalışmak için konsolda olmam gerektiğini ekledim .
bonafernando

19

Çoğu sidekiq sürümünde benim için çalışıyor:

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

İstatistikleri temizle (İsteğe bağlı)

Sidekiq::Stats.new.reset

Bu sadece kuyruğu değil, tüm veritabanını temizler.
Linus Oleander

sidekiq'in tüm veritabanını temizleyecek ve raylar konsolunda iyi çalışacak
vidur punj

-2

Yerleşik yöntemler olsa da bu kodu çalıştırarak sıranızı temizleyebilirsiniz.

queue = Sidekiq::Queue.new
queue.each do |job|
  job.delete 
end

Bu, tüm işleri kuyruktan alıp tek tek sildiğimiz için çalışmalıdır.
Asad Hameed

Hayır değil. Mevcut cevaplara bir göz atın. Aynı zamanda mevcut cevabın bir kopyasıdır.
Linus Oleander

Neden bahsettiğini bilmiyorum. Lütfen bana gönderdiğim cevabı gösterir misin?
Asad Hameed
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.