ruby Sidekiq列出所有作业[排队+运行]

vfwfrxfs  于 5个月前  发布在  Ruby
关注(0)|答案(5)|浏览(83)

有没有一种方法可以获得当前在队列中运行的所有作业的列表?基本上,我想知道给定类的作业是否已经在那里,我不想插入我的其他作业。我已经看到其他选项,但我想这样做。
我可以看到here如何获得队列中的作业列表。

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

字符串
据我所知,这将不包括处理/运行作业。有什么方法可以得到它们吗?

d7v8vwbk

d7v8vwbk1#

如果要从控制台列出所有当前运行的作业,请尝试以下操作

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

字符串
work是一个hash。
列出所有队列数据。

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获取所有计划的作业

67up9zun

67up9zun2#

运行作业:

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

dluptydi

dluptydi3#

假设你在排队时将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"]}

wfveoks0

wfveoks04#

我在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

字符串

mwyxok5s

mwyxok5s5#

如果你试图利用它来检查所有的工作或工作是否完成,然后再去做其他的事情,必须注意的是,这不是一个准确的方法来衡量。
关于工作状态报告的这一点非常重要:

Note: This data changes asynchronously, updating every 5 seconds. It is not millisecond-precise.

字符串
如果作业已从队列中删除,但工作进程尚未报告作业正在由工作进程处理,则会出现同步问题。
对于那些希望报告某项工作是否完成的人来说,最好的方法是在redis中设置一个标志,然后在工作中取消设置。等待标志消失,然后继续工作。

相关问题