how to delete a job in sidekiq

前端 未结 8 1990
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-07 20:32

I am using sidekiq in my rails app. Users of my app create reports that start a sidekiq job. However, sometimes users want to be able to cancel \"processing\" reports. Delet

相关标签:
8条回答
  • 2020-12-07 20:59

    You can delete sidekiq job filtering by worker class and args:

    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)
    
    0 讨论(0)
  • 2020-12-07 20:59

    There is simple way of deleting a job if you know the 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
    
    0 讨论(0)
  • 2020-12-07 21:03

    The simplest way I found to do this is:

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

    where [job_id] is the JID that pertains to the report. Followed by:

    job.delete
    

    I found no need to iterate through the entire queue as described by other answers here.

    0 讨论(0)
  • 2020-12-07 21:07

    I had the same problem, but the difference is that I needed to cancel a scheduled job, and my solution is:

    Sidekiq::ScheduledSet.new.each do |_job|
      next unless [online_jid, offline_jid].include? _job.jid
      status = _job.delete
    end
    
    0 讨论(0)
  • 2020-12-07 21:14

    According to this Sidekiq documentation page to delete a job with a single id you need to iterate the queue and call .delete on it.

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

    There is also a plugin called sidekiq-status that provides you the ability to cancel a single job

    scheduled_job_id = MyJob.perform_in 3600
    Sidekiq::Status.cancel scheduled_job_id #=> true
    
    0 讨论(0)
  • 2020-12-07 21:15

    I had the same problem. I solved it by registering the job id when I initialize it and by creating another function cancel! to delete it.

    Here is the code:

    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
    
    0 讨论(0)
提交回复
热议问题