У меня этот рабочий, который работает навсегда.
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-их развёртываний в очереди, запланированной позже, есть куча дубликатов рабочих. Итак, есть ли способ очистить все в одной очереди и предотвратить выполнение уже выполненных заданий после перенастройки?
Я использую sidekiq 3.0.