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
5条答案
按热度按时间d7v8vwbk1#
如果要从控制台列出所有当前运行的作业,请尝试以下操作
字符串
work
是一个hash。列出所有队列数据。
型
对于特定的队列,将其更改为
Sidekiq::Queue.new('queue_name')
同样,您可以使用
Sidekiq::ScheduledSet.new
获取所有计划的作业67up9zun2#
运行作业:
字符串
在所有队列中排队的作业:
型
dluptydi3#
假设你在排队时将Hash作为参数传递给Sidekiq。
字符串
然后从应用程序的任何位置检索它,如下所示
型
wfveoks04#
我在ApplicationJob中使用它来检查队列中是否已经有具有相同名称/参数的作业,并防止将其排队两次
apps/jobs/application_job.rb
字符串
mwyxok5s5#
如果你试图利用它来检查所有的工作或工作是否完成,然后再去做其他的事情,必须注意的是,这不是一个准确的方法来衡量。
关于工作状态报告的这一点非常重要:
字符串
如果作业已从队列中删除,但工作进程尚未报告作业正在由工作进程处理,则会出现同步问题。
对于那些希望报告某项工作是否完成的人来说,最好的方法是在redis中设置一个标志,然后在工作中取消设置。等待标志消失,然后继续工作。