#ruby-on-rails #sidekiq #rails-activejob
Вопрос:
Я должен проверить, было ли то же самое задание уже добавлено в очередь, прежде чем снова ставить в очередь.
В настоящее время я использую этот код, но он очень неэффективен, потому что загружает все объекты в память. Есть ли способ запросить, как обычную активную запись?
В идеале я бы хотел что-то вроде
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 amp;amp; arg['queue_name'] == queue_name amp;amp; ActiveJob::Arguments.deserialize(arg['arguments']) == arguments
found_jobs << job
end
end
end
end
return found_jobs
end
Ответ №1:
Готового решения не существует, но есть более простой способ определить, было ли задание уже поставлено в очередь ( true
/ false
):
def in_queues?(job_class, queue_name, arguments = [])
Sidekiq::Queue.new(queue_name).any? do |job|
job_class == job.klass amp;amp; job.args == arguments
end
end
Имейте в виду, что аргументы sidekiq представлены в виде массива. Например, если вы называете свою работу так:
SyncJob.perform_async([1, 2, 3])
затем вы проверяете, что он был поставлен в очередь следующим образом:
in_queues?("SyncJob", "high", [[1, 2, 3]])
Комментарии:
1. Спасибо! Это очень быстро! Я только что внес это изменение внутри блока, чтобы заставить его работать задание[‘завернуто’].to_s == job_class.to_s amp;amp; ActiveJob::Аргументы.десериализация(job.args[0][‘аргументы’]) == аргументы
2. @sparkle: да, я допустил опечатку, это должно было быть
klass
вместоclass
), ноargs
, похоже, работает нормально без десериализации на моей локальной машине3. класс-это «ActiveJob::Адаптеры очереди::SidekiqAdapter::JobWrapper», в то время как задание[‘завернуто’] — это «SyncJob»
4. ах, я вижу, вы используете его вместе с обертками activejob, в то время как я тестировал его с помощью простой настройки Sidekiq) в любом случае, я рад, что это сработало!
Ответ №2:
Проверка наличия существующей работы известна как «уникальные задания». Sidekiq Enterprise предоставляет эту функциональность, как и несколько сторонних драгоценных камней.
Реализация и использование кода, который вы описываете, — очень плохая идея.
Комментарии:
1. Почему это очень плохая идея?
2. См. раздел «Использование и предупреждение». mikeperham.com/2021/04/20/a-tour-of-the-sidekiq-api