【发布时间】:2012-08-17 07:32:48
【问题描述】:
我正在为我的员工使用 sidekiq。假设我为一名工作人员安排了 10k 个工作计划,但其中 4k 个工作仅来自一个用户,我怎样才能只取消与该用户相关的工作。 (假设 user_id 作为 worker 的参数发送)。
【问题讨论】:
标签: ruby-on-rails ruby sidekiq
我正在为我的员工使用 sidekiq。假设我为一名工作人员安排了 10k 个工作计划,但其中 4k 个工作仅来自一个用户,我怎样才能只取消与该用户相关的工作。 (假设 user_id 作为 worker 的参数发送)。
【问题讨论】:
标签: ruby-on-rails ruby sidekiq
可能有一种更有效的方法来执行此操作,但您可以做的是遍历队列中当前的作业,并删除符合您条件的作业,如下所示:
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 上运行之前对其进行大量测试,并且可能不要在有大量积压的队列上运行它。但在紧要关头,它可以工作。
【讨论】:
JID 删除/取消作业。我试图即兴发挥它。
JSON.load(job)['jid']。