【发布时间】:2014-06-02 01:27:00
【问题描述】:
我不小心在 Sidekiq 中排了一堆工作。我不想擦除我的整个 Redis 存储(并将所有 Sidekiq 数据和排队作业重置为零),但我想删除可以由给定类识别的所有排队作业。我该怎么做?
【问题讨论】:
我不小心在 Sidekiq 中排了一堆工作。我不想擦除我的整个 Redis 存储(并将所有 Sidekiq 数据和排队作业重置为零),但我想删除可以由给定类识别的所有排队作业。我该怎么做?
【问题讨论】:
我发现Sidekiq API 提供了一种简单的方法来满足我的需要:
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
我相信有办法更优雅地写下这一点(也许是一个选择?) 但它是可读的。 希望我能够帮助像我这样的别人正在寻找这样的东西。
【讨论】:
jobs.args.first['job_class']但它不起作用。 @Ivar 使用 job.klass 的答案工作正常。此外,根据Sidekiq API Doc,Job.klass应该是正确的解决方案。 span>
在帮助模块中尝试这样的方法,其中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
【讨论】: