如何通过 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 一样提供此功能。
实施和使用您描述的代码是一个非常的坏主意。
在再次入队之前,我必须检查是否已经将相同的作业添加到队列中。
目前我使用这段代码,但它非常低效,因为它将所有对象加载到内存中。有没有办法像普通活动记录一样查询?
理想情况下,我想要
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 一样提供此功能。
实施和使用您描述的代码是一个非常的坏主意。