如何通过 Job class、队列名称和参数查询 Sidekiq 队列?

How to query Sidekiq queues by Job class, queue name and arguments?

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

目前我使用这段代码,但它非常低效,因为它将所有对象加载到内存中。有没有办法像普通活动记录一样查询?

理想情况下,我想要

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 和几个第 3 方 gem 一样提供此功能。

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