ฉันเป็นคนงานที่ทำงานตลอดกาล
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=1 sidekiq --verbose --environment production -C config/sidekiq.yml
sidekiq
นั่นหมายความว่าคนงานเก่าจะหยุดทั้งคนที่กำลังทำงานอยู่ แต่คนที่ถูกเลื่อนเวลาไปด้วย
ฉันลองเรียกใช้สิ่งนี้เมื่อเริ่มต้น (ก่อนที่จะโหลดงานใหม่) แต่ไม่ได้ผล
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-ish จะมีคนงานที่ซ้ำกันจำนวนมากในคิวที่กำหนดไว้ในภายหลัง ดังนั้นมีวิธีล้างทุกอย่างในคิวเดียวและป้องกันไม่ให้งานที่รันอยู่แล้วจากการจัดตารางใหม่ได้หรือไม่?
ฉันใช้ sidekiq 3.0