我不小心在Sidekiq排队了一大堆工作。我不想擦除我的整个Redis商店(并将所有Sidekiq数据和排队作业重置为nil)但我想删除所有可以由给定类识别的排队作业。我该怎么做?
答案 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
我敢肯定,有一种方法可以更优雅地编写此代码(也许有选择吗?) 但这是可读的。 希望我能够帮助像我这样的人,寻找类似的东西。