У мене цей працівник, який працює вічно.
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.