Ruby 如何从sidekiq队列中删除特定类别的作业?
我不小心在Sidekiq把一堆工作排成了队列。我不想擦除我的整个Redis存储(并将所有Sidekiq数据和排队作业重置为零),但我想删除可以由给定类识别的所有排队作业。我该怎么做?在助手模块中尝试这样的方法,其中Ruby 如何从sidekiq队列中删除特定类别的作业?,ruby,redis,sidekiq,Ruby,Redis,Sidekiq,我不小心在Sidekiq把一堆工作排成了队列。我不想擦除我的整个Redis存储(并将所有Sidekiq数据和排队作业重置为零),但我想删除可以由给定类识别的所有排队作业。我该怎么做?在助手模块中尝试这样的方法,其中klass是工人类 def self.delete_jobs_for_worker(klass) jobs = Sidekiq::ScheduledSet.new jobs.select do |job| job.klass == 'Sidekiq::Extensi
klass
是工人类
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
我发现提供了一种简单的方法来满足我的需要:
queue = Sidekiq::Queue.new(queue_name)
queue.each do |job|
puts job.klass
job.delete if job.klass == job_class
end
这些答案很有帮助,但对我来说并没有回答最初的问题。这些解决方案可能已经过时了 您必须访问作业的参数,并在循环范围内获取它的实际作业类。我尝试了上面的方法,但没有达到预期效果,因为
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
我相信有一种方法可以写得更优雅(也许是用精选的?)
但它是可读的。
希望我能够帮助像我这样正在寻找类似产品的人。相关感谢您的提示!您提供的代码示例使我找到了我错过的文档页面,其中包含了我执行所需操作所需的信息。这看起来很棒,感谢您提供了有用的增强功能。我已经将此作为正式答案。很高兴我能够帮助@IvarI尝试了
jobs.args.first['job\u class']
,但没有成功@Ivar使用job.klass的回答很好。此外,根据Sidekiq API文档,job.klass应该是正确的解决方案。