[ruby-on-rails] 사이드 키크 대기열 지우기

나는 영원히 달리는 일꾼이다.

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을 사용하고 있습니다.



답변

대기열을 제거하여 대기열의 모든 작업을 삭제합니다.

require 'sidekiq/api' # for the case of rails console

Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear


답변

이것은 나를 위해 트릭을했습니다.

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear


답변

대부분의 sidekiq 버전에서 나를 위해 작동합니다.

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

통계 지우기 (선택 사항)

Sidekiq::Stats.new.reset


답변

기본 제공 메서드가 있지만이 코드를 실행하여 큐를 지울 수 있습니다.

queue = Sidekiq::Queue.new
queue.each do |job|
  job.delete
end


답변