У меня есть этот рабочий, который бежит вечно.
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)
После пятикратного развертывания в очереди, запланированной на более позднее время, появляется куча повторяющихся рабочих процессов. Итак, есть ли способ очистить все в одной очереди и предотвратить перепланирование уже запущенных заданий?
Я использую sidekiq 3.0.
ruby-on-rails
sidekiq
Линус Олеандр
источник
источник
Ответы:
Удаляет все задания в очереди, удаляя очередь.
require 'sidekiq/api' # for the case of rails console Sidekiq::Queue.new("infinity").clear Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear
источник
Sidekiq::Stats.new.reset
я выяснил, что это помогаетSidekiq::Queue.all.first.clear
Sidekiq::Queue.all.each &:clear
Это помогло мне:
Sidekiq::Queue.all.each(&:clear) Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear Sidekiq::DeadSet.new.clear
источник
kill
подобную командуrequire 'sidekiq/api'
работать на консоли.У меня работает для большинства версий sidekiq:
Sidekiq::RetrySet.new.clear Sidekiq::ScheduledSet.new.clear
Очистить статистику (необязательно)
Sidekiq::Stats.new.reset
источник
Вы можете очистить свою очередь, запустив этот код, хотя там будут встроенные методы.
queue = Sidekiq::Queue.new queue.each do |job| job.delete end
источник