如何删除sidekiq中的作业

Mat*_*man 36 ruby-on-rails sidekiq

我在我的rails应用程序中使用sidekiq.我的应用程序的用户创建启动sidekiq作业的报告.但是,有时用户希望能够取消"处理"报告.删除报告很简单,但我也需要能够删除sidekiq作业.

到目前为止,我已经能够获得这样的工人列表:

workers = Sidekiq::Workers.new
Run Code Online (Sandbox Code Playgroud)

并且每个worker都有包含report_id的args,因此我可以识别哪个作业属于哪个报告.但是,我不确定如何实际删除该作业.应该注意的是,我想删除作业当前是忙还是重试.

Sim*_*tti 67

根据这个Sidekiq文档页面删除具有单个ID的作业,您需要迭代队列并调用.delete它.

queue = Sidekiq::Queue.new("mailer")
queue.each do |job|
  job.klass # => 'MyWorker'
  job.args # => [1, 2, 3]
  job.delete if job.jid == 'abcdef1234567890'
end
Run Code Online (Sandbox Code Playgroud)

还有一个名为sidekiq-status的插件,可让您取消单个作业

scheduled_job_id = MyJob.perform_in 3600
Sidekiq::Status.cancel scheduled_job_id #=> true
Run Code Online (Sandbox Code Playgroud)


小智 18

我发现这样做的最简单方法是:

job = Sidekiq::ScheduledSet.new.find_job([job_id])
Run Code Online (Sandbox Code Playgroud)

其中[job_id]是与报告相关的JID.其次是:

job.delete
Run Code Online (Sandbox Code Playgroud)

我发现没有必要像其他答案所描述的那样遍历整个队列.

  • @ bartolo-otrit你有什么建议吗? (3认同)
  • find_job使用[相同](https://github.com/mperham/sidekiq/blob/046f76a63fab2e03f8ab8be0e48a53ecc3f8d75b/lib/sidekiq/api.rb)线性搜索.这是来自[文档](https://github.com/mperham/sidekiq/wiki/API)的评论:"如果你的队列很大,这是非常低效的!" (2认同)

Kim*_*Gao 16

我有同样的问题,但不同的是我需要取消预定的工作,我的解决方案是:

Sidekiq::ScheduledSet.new.each do |_job|
  next unless [online_jid, offline_jid].include? _job.jid
  status = _job.delete
end
Run Code Online (Sandbox Code Playgroud)


the*_*uth 7

如果你想取消预定的工作,我不确定@KimiGao 的回答,但这是我从 Sidekiq 的当前 API 文档中改编的:

jid = MyCustomWorker.perform_async

r = Sidekiq::ScheduledSet.new
jobs = r.select{|job| job.jid == jid }
jobs.each(&:delete)
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。


小智 5

您可以通过工人类和参数删除 sidekiq 作业过滤:

class UserReportsWorker
  include Sidekiq::Worker
  def perform(report_id)
    # ...
  end
end


jobs = Sidekiq::ScheduledSet.new.select do |retri| 
  retri.klass == "UserReportsWorker" && retri.args == [42]
end
jobs.each(&:delete)
Run Code Online (Sandbox Code Playgroud)