首页 > 解决方案 > 如何按作业类、队列名称和参数查询 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

标签: ruby-on-railssidekiqrails-activejob

解决方案


检查现有作业称为“独特作业”。Sidekiq Enterprise 提供此功能,一些 3rd 方 gem 也提供此功能。

实现和使用您描述的代码是一个非常糟糕的主意。


推荐阅读