Лучший способ найти работу в любом месте в 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) } }