通过参数取消sidekiq worker

时间:2012-08-21 21:53:02

标签: ruby-on-rails ruby sidekiq

我正在为我的工人使用sidekiq。假设我有一个单独的工作人员有10k个工作计划,但是这些工作中只有4k来自一个用户,我怎么才能取消与该用户相关的工作。 (让我们说user_id是作为工人的参数发送的。)

1 个答案:

答案 0 :(得分:1)

这可能是一种更有效的方法,但您可以做的是迭代当前队列中的作业,并删除符合条件的作业,如下所示:

def delete_jobs_by_user_id(queue, user_id)
  Sidekiq.redis do |r| 
    queue_key = "queue:#{queue}"
    jobs = r.lrange(queue_key, 0, -1) 

    jobs.each do |job|
      r.lrem(queue_key, 0, job) if JSON.load(job)['args'].include?(user_id)
    end 
  end
end

如果您正在寻找的课程,arg处于正确的位置等等,您还需要添加更多支票才能删除作业,但这样可以让您走上正确的轨道。

显然在prod上运行之前测试了这一堆,并且可能不会在具有大量积压的队列上运行它。但是在紧要关头,它可以发挥作用。