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.