在Sidekiq任何地方找工作的最佳方式

时间:2013-06-14 13:39:54

标签: ruby-on-rails ruby 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

但考虑到队列有多大,在迭代过程中作业可能会在各组之间移动并被遗漏。

2 个答案:

答案 0 :(得分:5)

似乎你想在产生它之后的某个时刻知道你的工作状态,你也保持其身份。有一些插件正是为了它们,它们具有相似的功能和几乎相同的名称:

Sidekiq::Status - 我是它的原始作者,现在它得到了更多的Ruby开发人员的支持

SidekiqStatus - 另类

[编辑]以上内容可能已经过时,只需检查Sidekiq的wiki即可找到最适合您的队列/状态管理: https://github.com/mperham/sidekiq/wiki/Related-Projects

答案 1 :(得分:0)

或者,如果您不想存储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) } }