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

Iva*_*var 2 ruby redis sidekiq

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

Iva*_*var 6

我发现Sidekiq API提供了一种执行所需功能的简便方法:

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


Oct*_*ock 5

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

您必须访问作业的 args 并在循环范围内获取它的实际作业类。我尝试了上述方法,但没有按预期工作,因为job.klass没有返回您期望的结果。

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

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

ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper
=> nil
Run Code Online (Sandbox Code Playgroud)

所以我的解决方案是像这样深入研究工作的论点:

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
Run Code Online (Sandbox Code Playgroud)

我确信有一种方法可以更优雅地编写它(也许使用选择?)但它是可读的。希望我能够帮助像我这样正在寻找这样的东西的人。