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.
ruby-on-rails
sidekiq
Linus Oleander
sumber
sumber
Jawaban:
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
sumber
Sidekiq::Stats.new.reset
saya menemukan bahwa ini membantuSidekiq::Queue.all.first.clear
Sidekiq::Queue.all.each &:clear
Ini melakukan trik untuk saya:
Sidekiq::Queue.all.each(&:clear) Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear Sidekiq::DeadSet.new.clear
sumber
kill
perintah sepertirequire 'sidekiq/api'
di konsol untuk bekerja.Bekerja untuk saya untuk sebagian besar versi sidekiq:
Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear
Hapus statistik (Opsional)
Sidekiq::Stats.new.reset
sumber
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
sumber