如何删除sidekiq中的作业

时间:2014-01-13 21:00:37

标签: ruby-on-rails sidekiq

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

到目前为止,我已经能够得到像这样的工人名单:

workers = Sidekiq::Workers.new

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

8 个答案:

答案 0 :(得分:60)

根据此Sidekiq documentation page删除具有单个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

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

scheduled_job_id = MyJob.perform_in 3600
Sidekiq::Status.cancel scheduled_job_id #=> true

答案 1 :(得分:16)

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

job = Sidekiq::ScheduledSet.new.find_job([job_id])

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

job.delete

我发现没有必要按照其他答案的描述迭代整个队列。

答案 2 :(得分:15)

我遇到了同样的问题,但区别在于我需要取消预定的工作,我的解决方案是:

Sidekiq::ScheduledSet.new.each do |_job|
  next unless [online_jid, offline_jid].include? _job.jid
  status = _job.delete
end

答案 3 :(得分:3)

如果您想取消预定的工作,我不确定@KimiGao的答案,但这是我改编自Sidekiq目前的API文档:

jid = MyCustomWorker.perform_async

r = Sidekiq::ScheduledSet.new
jobs = r.select{|job| job.jid == jid }
jobs.each(&:delete)

希望它有所帮助。

答案 4 :(得分:3)

您可以按工人类和args删除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)

答案 5 :(得分:1)

我遇到了同样的问题。 我通过在初始化时注册作业ID并通过创建另一个函数SELECT * FROM routine_actions AS ra JOIN routines AS r ON r.id = ra.routine_id JOIN account_routines AS ar ON ar.routine_id = r.id JOIN ( SELECT account_id , MAX(priority) AS max_priority FROM account_routines GROUP BY account_id ) AS mxr ON ar.priority = mxr.max_priority AND ar.account_id = mxr.account_id JOIN accounts AS a ON a.id = ar.account_id WHERE ... 来删除它来解决它。

以下是代码:

cancel!

答案 6 :(得分:0)

如果您知道job_id,可以使用简单的方法删除作业:

job = Sidekiq::ScheduledSet.new.find_job(job_id)
begin
  job.delete
rescue
  Rails.logger.error "Job: (job_id: #{job_id}) not found while deleting jobs."
end

答案 7 :(得分:0)

或者您可以在Rails服务器上使用sidekiq页面。

例如,http://localhost:3000/sidekiq,您可以停止/删除sidekiq作业。

在此之前,您必须更新routes.rb。

require 'sidekiq/web'
mount Sidekiq::Web => '/sidekiq'