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.