【问题标题】:Sidekiq list all jobs [queued + running]Sidekiq 列出所有作业 [排队 + 运行]
【发布时间】:2018-06-29 03:28:15
【问题描述】:

有没有办法获取当前队列中正在运行的所有作业的列表?基本上,我想知道给定班级的工作是否已经存在,我不想插入我的其他工作。我见过其他选择,但我想这样做。

我可以看到here如何获取队列中的作业列表。

queue = Sidekiq::Queue.new("mailer")
queue.each do |job|
  job.klass # => 'MyWorker'
end

据我了解,这不包括处理/运行作业。有什么办法得到吗?

【问题讨论】:

标签: ruby-on-rails ruby sidekiq


【解决方案1】:

我在 ApplicationJob 中使用它来检查队列中是否已经存在具有相同名称/参数的作业并防止将其排队两次

apps/jobs/application_job.rb

class ApplicationJob < ActiveJob::Base
    

    # Check if there is the same job already queued
    around_enqueue do |job, block|
        
        existing_queued_jobs = list_queued_jobs(job.class, job.queue_name, job.arguments)
        if existing_queued_jobs.size == 0
            block.call # this will enqueue your job
        else
            puts "JOB not enqueue because already queued (#{job.class}, #{job.queue_name}, #{job.arguments})"
        end
    end


    def list_queued_jobs(job_class, queue_name,  arguments)
        found_jobs = []
        queues = Sidekiq::Queue.all
        queues.each do |queue|
            queue.each do |job|
                job.args.each do |arg|
                     found_jobs << job if arg['job_class'].to_s == job_class.to_s && arg['queue_name'] == queue_name && arg['arguments'] == arguments
                end
            end
        end
        return found_jobs
    end
   


end

【讨论】:

    【解决方案2】:

    如果你想从控制台列出所有当前正在运行的作业,试试这个

    workers = Sidekiq::Workers.new
    workers.each do |_process_id, _thread_id, work|
      p work
    end
    

    work 是一个哈希。

    列出所有队列数据。

    queues = Sidekiq::Queue.all
    queues.each do |queue|
      queue.each do |job|
        p job.klass, job.args, job.jid
      end
    end
    

    对于特定队列,将其更改为 Sidekiq::Queue.new('queue_name')

    同样,您可以使用 Sidekiq::ScheduledSet.new 获取所有预定的作业

    【讨论】:

    • 这个答案可能已经过时了:我得到NoMethodError: undefined method klass'`
    • job.klass 在 2020 年仍然可用。请查看 github.com/mperham/sidekiq/blob/…
    • 调用job.jid 似乎会产生以下错误:NoMethodError: undefined method jid' for #<:queue:0x00007ff144076178>` 这是因为我们试图从排队?
    【解决方案3】:

    运行作业:

    Sidekiq::Workers.new.each do |_process_id, _thread_id, work|
      p work
    end
    

    所有队列中的排队作业:

    Sidekiq::Queue.all.each do |queue|
      # p queue.name, queue.size
      queue.each do |job|
        p job.klass, job.args
      end
    end
    

    【讨论】:

    • 澄清一下:Sidekiq::Queue.all 只会输出正在进行的作业,而不是预定的作业。正如接受的答案所述,您需要使用 Sidekiq::ScheduledSet.new 来获取计划的作业。
    • @sharq 你能考虑删除这个答案,因为它与接受的相同吗?
    【解决方案4】:

    假设您在入队时将 Hash 作为参数传递给 Sidekiq。

    args = {
      "student_id": 1,
      "student_name": "Michael Moore"
        }
    
    YourWorker.perform_in(1.second,args)
    

    然后从您的应用程序的任何地方,您都可以按以下方式检索它

          ss = Sidekiq::ScheduledSet.new
          student_id_list = ss.map{|job| job['args'].first["student_id"]}
    

    【讨论】:

      猜你喜欢
      • 2015-07-06
      • 2013-06-16
      • 2019-01-14
      • 1970-01-01
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      相关资源
      最近更新 更多