13

是否有一种简单的方法可以在所有 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

但是考虑到队列有多大,在迭代过程中工作可能会在集合之间移动并被错过。

4

2 回答 2

7

似乎您想在生成它后的某个时刻了解您的工作状态,同时您也保留它的 ID。有几个插件正是为此,它们具有相似的功能和几乎相同的名称:

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

SidekiqStatus - 另一种选择

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

于 2013-07-31T21:15:32.587 回答
4

或者你可以做这样的事情,如果你不想存储 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) } }
于 2019-08-23T07:29:42.827 回答