如何通过作业类、队列名称和参数查询Sidekiq队列?



在再次进入队列之前,我必须检查相同的作业是否已经添加到队列中。

目前我使用这段代码,但它非常低效,因为它将所有对象加载到内存中。是否有一种方法来查询像一个正常的活动记录?

理想情况下,我应该是

Sidekiq::Queue.where(job_class: "SyncJob", queue_name:"high", arguments: [1,2,3])

当前代码:

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|
if arg['job_class'].to_s == job_class.to_s && arg['queue_name'] == queue_name && ActiveJob::Arguments.deserialize(arg['arguments']) == arguments
found_jobs << job
end
end
end
end
return found_jobs
end

没有现成的解决方案,但是有一种更简单的方法来确定作业是否已经排队(true/false):

def in_queues?(job_class, queue_name,  arguments = [])
Sidekiq::Queue.new(queue_name).any? do |job|
job_class == job.klass && job.args == arguments
end
end

请记住,sidekiq参数以数组形式表示。例如,如果你这样称呼你的工作:

SyncJob.perform_async([1, 2, 3])

,然后检查它是否已经排队,如下所示:

in_queues?("SyncJob", "high", [[1, 2, 3]])

检查现有作业称为"唯一作业"。Sidekiq Enterprise提供了这个功能,一些第三方的宝石也提供了这个功能。

实现和使用你描述的代码是一个非常坏主意。