我在我的Rails应用程序中使用Sidekiq。我的应用程序用户创建报告,这些报告会启动Sidekiq作业。然而,有时用户希望能够取消“处理”报告。删除报告很容易,但我还需要能够删除Sidekiq作业。
到目前为止,我已经成功获取了工作者列表:
workers = Sidekiq::Workers.new
每个工作人员都有参数,包括报告 ID,以便我可以确定哪个工作属于哪个报告。但是,我不确定如何实际删除该工作。需要注意的是,无论工作当前是否繁忙或设置为重试,我都想删除该工作。
我在我的Rails应用程序中使用Sidekiq。我的应用程序用户创建报告,这些报告会启动Sidekiq作业。然而,有时用户希望能够取消“处理”报告。删除报告很容易,但我还需要能够删除Sidekiq作业。
到目前为止,我已经成功获取了工作者列表:
workers = Sidekiq::Workers.new
每个工作人员都有参数,包括报告 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
我发现最简单的方法是:
job = Sidekiq::ScheduledSet.new.find_job([job_id])
其中 [job_id] 是与报告相关的 JID。
job.delete
我发现没有必要像其他答案中描述的那样遍历整个队列。
我有同样的问题,不过我的区别在于我需要取消一个预定的任务,我的解决方案是:
Sidekiq::ScheduledSet.new.each do |_job|
next unless [online_jid, offline_jid].include? _job.jid
status = _job.delete
end
create_log
是用来做什么的? - thekingoftruthjid = MyCustomWorker.perform_async
r = Sidekiq::ScheduledSet.new
jobs = r.select{|job| job.jid == jid }
jobs.each(&:delete)
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)
我曾经遇到过同样的问题。
我通过在初始化时注册作业ID并创建另一个名为cancel!
的函数来解决它。
以下是代码:
after_enqueue do |job|
sidekiq_job = nil
queue = Sidekiq::Queue.new
sidekiq_job = queue.detect do |j|
j.item['args'][0]['job_id'] == job.job_id
end
if sidekiq_job.nil?
scheduled = Sidekiq::ScheduledSet.new
sidekiq_job = scheduled.detect do |j|
j.item['args'][0]['job_id'] == job.job_id
end
end
if sidekiq_job.present?
booking = job.arguments.first
booking.close_comments_jid = sidekiq_job.jid
booking.save
end
end
def perform(booking)
# do something
end
def self.cancel!(booking)
queue = Sidekiq::Queue.new
sidekiq_job = queue.find_job(booking.close_comments_jid)
if sidekiq_job.nil?
scheduled = Sidekiq::ScheduledSet.new
sidekiq_job = scheduled.find_job(booking.close_comments_jid)
end
if sidekiq_job.nil?
# Report bug in my Bug Tracking tool
else
sidekiq_job.delete
end
end
如果您知道作业的 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
require 'sidekiq/web'
mount Sidekiq::Web => '/sidekiq'