【问题标题】:how to remove a specific class of jobs from a sidekiq queue?如何从 sidekiq 队列中删除特定类别的作业?
【发布时间】:2014-06-02 01:27:00
【问题描述】:

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

【问题讨论】:

标签: ruby redis sidekiq


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    您必须访问作业的参数并在循环范围内获取它的实际作业类。我尝试了上述方法,但它没有按预期工作,因为 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
    

    我相信有办法更优雅地写下这一点(也许是一个选择?) 但它是可读的。 希望我能够帮助像我这样的别人正在寻找这样的东西。

    【讨论】:

    • 这看起来很棒,谢谢你的增强功能。我已将此作为官方答案。
    • 很高兴我能够帮助@ivar span>
    • 我尝试过jobs.args.first['job_class']但它不起作用。 @Ivar 使用 job.klass 的答案工作正常。此外,根据Sidekiq API Doc,Job.klass应该是正确的解决方案。 span>
    【解决方案3】:

    在帮助模块中尝试这样的方法,其中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
    

    【讨论】:

    • 感谢您的提示!您提供的代码示例将我带到了我错过的文档页面,其中包含执行所需的信息。
    猜你喜欢
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多