私は永遠に走るこの労働者を持っています。
class Worker
include Sidekiq::Worker
sidekiq_options queue: "infinity", retry: true
def perform(params)
# ...
self.class.perform_in(30.seconds, params)
end
end
問題は、このように起動時にワーカーをロードすることです。 config/initializers/load_workers.rb
Rails.application.config.after_initialize do
if ENV["SIDEKIQ"] == "1"
Worker.perform_async({})
end
end
これを使用してsidekiqを開始しますSIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml
。
これは、現在実行中のワーカーと再スケジュールされているワーカーの両方で、古いワーカーが停止することを意味します。
起動時に(新しい作品をロードする直前に)これを実行しようとしましたが、うまくいきませんでした。
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っぽいデプロイの後、後でスケジュールされたキューに多数の重複ワーカーがあります。それで、1つのキューのすべてをクリアし、すでに実行中のジョブが再スケジュールされないようにする方法はありますか?
sidekiq3.0を使用しています。