我有一个永远运转的工人。
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。