在再次入隊之前,我必須檢查是否已將相同的作業添加到佇列中。
目前我使用此代碼但效率非常低,因為它將所有物件加載到記憶體中。有沒有辦法像普通的活動記錄一樣查詢?
理想情況下,我會喜歡
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
uj5u.com熱心網友回復:
沒有開箱即用的解決方案,但有一種更簡單的方法來確定作業是否已經排隊 ( 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]])
uj5u.com熱心網友回復:
檢查現有作業稱為“唯一作業”。Sidekiq Enterprise 提供了此功能,一些 3rd 方 gem 也是如此。
實作和使用您描述的代碼是一個非常糟糕的主意。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328669.html
下一篇:如何驗證100以下的用戶輸入
