如何从sidekiq队列中删除特定类别的作业?

时间:2014-04-17 16:40:26

标签: ruby redis sidekiq

我不小心在Sidekiq排队了一大堆工作。我不想擦除我的整个Redis商店(并将所有Sidekiq数据和排队作业重置为nil)但我想删除所有可以由给定类识别的排队作业。我该怎么做?

3 个答案:

答案 0 :(得分:5)

我发现Sidekiq API提供了一种简单的方法来满足我的需求:

queue = Sidekiq::Queue.new(queue_name)
queue.each do |job|
    puts job.klass
    job.delete if job.klass == job_class
end

答案 1 :(得分:1)

在helper模块中尝试这样的方法,其中klass是Worker类。

 def self.delete_jobs_for_worker(klass)

  jobs = Sidekiq::ScheduledSet.new
  jobs.select do |job|
    job.klass == 'Sidekiq::Extensions::DelayedClass' &&
        ((job_klass, job_method, args) = YAML.load(job.args[0])) &&
        job_klass == klass 
  end.map(&:delete)

end

答案 2 :(得分:1)

这些答案很有帮助,但没有为我回答最初的问题。这些解决方案可能过时了。

您必须访问作业的args并在循环范围内获取其实际的作业类。我尝试了上述操作,但由于job.klass无法返回您期望的结果而无法正常工作。

这是当前在终端中返回的内容:

queue.each do |job|
  puts job.klass
end

ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper
=> nil

所以我的解决方案是像这样挖掘工作的论点:

queue = Sidekiq::Queue.new(“job_queue_name”)

queue.each do |job|
  puts job.args.first['job_class']
  job.delete if job.args.first['job_class'] == "Things::DoesThatThingJob"
end

我敢肯定,有一种方法可以更优雅地编写此代码(也许有选择吗?) 但这是可读的。 希望我能够帮助像我这样的人,寻找类似的东西。