Hapus antrian sidekiq

93

Saya memiliki pekerja yang berjalan selamanya.

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

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

Masalahnya adalah saya memuat pekerja saat start up, seperti ini. config/initializers/load_workers.rb

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

Menggunakan ini untuk memulai sidekiq SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml.

Ini berarti pekerja lama harus berhenti, baik yang sedang berjalan tetapi juga yang dijadwalkan ulang.

Saya mencoba menjalankan ini saat memulai (tepat sebelum memuat karya baru), tetapi tidak berhasil.

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)

Setelah penerapan 5-ish, ada banyak pekerja duplikat dalam antrean yang dijadwalkan untuk nanti. Jadi, apakah ada cara untuk menghapus semua dalam satu antrian dan mencegah pekerjaan yang sudah berjalan dari penjadwalan ulang?

Saya menggunakan sidekiq 3.0.

Linus Oleander
sumber
Apakah Anda ingin menghapus antrian atau pekerjaan yang dijadwalkan. atau lebih baik dikatakan duplikat pekerjaan terjadwal.
Sabyasachi Ghosh
Saya ingin menghapus setiap jejak pekerjaan sebelum saya memuat pekerja baru.
Linus Oleander
ok mengerti masalah Anda .. berarti Anda ingin menghapus semua pekerjaan yang dijadwalkan.
Sabyasachi Ghosh
@haSabyasachiGhosh Tidak, saya ingin menghapus semua yang berhubungan dengan antrian, bukan hanya pekerjaan yang dijadwalkan. Dengan kata lain; gagal, sedang berlangsung, antrian dan pekerjaan yang dijadwalkan harus dihapus.
Linus Oleander
Semua bantuan ada di sini - github.com/mperham/sidekiq/wiki/API
viks

Jawaban:

161

Menghapus semua Pekerjaan dalam Antrean, dengan menghapus antrian.

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

Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Ranjithkumar Ravi
sumber
Mungkin Sidekiq Pro akan membantu Anda.
Ranjithkumar Ravi
5
Ini untuk menghapus penghitung Sidekiq::Stats.new.resetsaya menemukan bahwa ini membantu
14
Untuk menghapus default / antrian pertama:Sidekiq::Queue.all.first.clear
pengguna456584
1
Sidekiq :: Queue.new ("laporan"). Clear dan Sidekiq :: Queue.new ("alerts"). Clear membantu membersihkan antrian saat ini. Tapi bagaimana dengan Busy? Bagaimana cara menghapus pekerjaan "Sibuk"?
Donato
31
Bersihkan semuanya denganSidekiq::Queue.all.each &:clear
Marco Lazzeri
95

Ini melakukan trik untuk saya:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear
iGEL
sumber
1
Terima kasih ini bekerja seperti pesona saya berada dalam keadaan darurat haha, sahabat karibnya dengan waaaaaay terlalu banyak pekerja dalam antrian ini bekerja seperti yang saya harapkan karena saya mencari killperintah seperti
d1jhoni1b
Sempurna, hanya menambahkan bahwa di env saya, saya harus require 'sidekiq/api'di konsol untuk bekerja.
bonafernando
19

Bekerja untuk saya untuk sebagian besar versi sidekiq:

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

Hapus statistik (Opsional)

Sidekiq::Stats.new.reset
rusllonrails
sumber
Ini membersihkan seluruh database, bukan hanya antrian.
Linus Oleander
jika akan menghapus semua database sidekiq, dan akan bekerja dengan baik di konsol rel
vidur punj
-2

Anda dapat menghapus antrian Anda dengan menjalankan kode ini meskipun akan ada metode bawaan.

queue = Sidekiq::Queue.new
queue.each do |job|
  job.delete 
end
Asad Hameed
sumber
Nah, ini seharusnya berfungsi saat kita mengambil semua pekerjaan dari antrian dan kemudian menghapusnya satu per satu.
Asad Hameed
Tidak, tidak. Lihatlah jawaban yang ada. Itu juga merupakan duplikat dari jawaban yang sudah ada.
Linus Oleander
Aku tidak tahu apa yang kamu bicarakan. Bisakah Anda menunjukkan jawaban yang sama dengan yang saya posting?
Asad Hameed