Лучший способ найти работу в любом месте в Sidekiq

Есть ли простой способ поиска по всем sidekiq (очереди, повторы, расписания и т.д.) для конкретной работы?

В настоящее время я делаю это:

if !Sidekiq::Queue.new("feeds").find {|j| j.args[0] == feed.id && j.args[1] == true }
  if !Sidekiq::RetrySet.new.find {|j| j.queue == 'feeds' && j.args[0] == feed.id && j.args[1] == true }
    if !Sidekiq::ScheduledSet.new.find {|j| j.queue == 'feeds' && j.args[0] == feed.id && j.args[1] == true }
      feed.sync
    end
  end
end

Но учитывая, как большие очереди могут получить, есть шанс, что задание может перемещаться между наборами во время итерации и пропустить.

Ответ 1

Похоже, вы хотите узнать свой статус работы в какой-то момент после его появления, также вы сохраняете его идентификатор. Для этого есть пара плагинов, они имеют схожую функциональность и практически одинаковые названия:

Sidekiq :: Status - я был его первоначальным автором, теперь он поддерживается более подходящими разработчиками Ruby

SidekiqStatus - альтернатива

[edit] вышесказанное может быть уже устаревшим, просто зайдите на Sidekiq wiki, чтобы найти управление очередью/статусом, которое подходит вам лучше всего: https://github.com/mperham/sidekiq/wiki/Related-Projects

Ответ 2

Или вы можете сделать что-то вроде этого, если вы не хотите хранить JID:

ss = Sidekiq::ScheduledSet.new
rs = Sidekiq::RetrySet.new
qs = Sidekiq::Queue.new('feeds')

feed.sync if [ss, rs, qs].all?{ |s| s.none?{ |j| (j.klass == 'SomeWorker') && (j.args[0] == feed.id) && (j.args[1] == true) } }