Tôi đã làm việc cho công nhân này mãi mãi.
class Worker
include Sidekiq::Worker
sidekiq_options queue: "infinity", retry: true
def perform(params)
# ...
self.class.perform_in(30.seconds, params)
end
end
Vấn đề là tôi tải công nhân khi khởi động, như thế này. config/initializers/load_workers.rb
Rails.application.config.after_initialize do
if ENV["SIDEKIQ"] == "1"
Worker.perform_async({})
end
end
Sử dụng điều này để bắt đầu sidekiq SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml
.
Điều này có nghĩa là những công nhân cũ sẽ dừng lại, cả những người hiện đang chạy nhưng cũng có những người đang được dời lại.
Tôi đã thử chạy cái này khi khởi động (ngay trước khi tải tác phẩm mới), nhưng không hiệu quả.
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)
Sau khi triển khai 5-ish, có nhiều nhân viên trùng lặp trong hàng đợi được lên lịch sau. Vì vậy, có cách nào để xóa mọi thay đổi trong một hàng đợi và ngăn việc lên lịch lại các công việc đang chạy không?
Tôi đang sử dụng sidekiq 3.0.