나는 영원히 달리는 일꾼이다.
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-ish 배포 후에는 나중에 예약 된 대기열에 많은 중복 작업자가 있습니다. 그렇다면 하나의 대기열에서 모든 항목을 지우고 이미 실행중인 작업이 다시 예약되지 않도록하는 방법이 있습니까?
sidekiq 3.0을 사용하고 있습니다.