Some Sidekiq jobs in my app are scheduled to change the state of a resource to cancelled unless a user responds within a certain timeframe. There is a lot of information about how to best accomplish this task, but none of it actually cancels the job.
To cancel a job, the code in the wiki says:
class MyWorker
 include Sidekiq::Worker
 def perform(thing_id)
  return if cancelled?
  thing = Thing.find thing_id
  thing.renege!
 end
 def cancelled?
  Sidekiq.redis {|c| c.exists("cancelled-#{jid}") }
 end
 def self.cancel!(jid)
  Sidekiq.redis {|c| c.setex("cancelled-#{jid}", 86400, 1) }
 end
end
Yet here it's suggested that I do something like
 def perform(thing_id)
  thing = Thing.find thing_id
  while !cancel?(thing)
   thing.ignore!
  end
 end
 def cancel?(thing_id)
  thing = Thing.find thing_id
  thing.matched? || thing.passed?
 end
What's confusing about this and similar code on the wiki is none of it actually cancels the job. The above example just performs an update on thing if cancelled? returns false (as it should), but doesn't cancel if and when it returns true in the future. It just fails with an aasm transition error message and gets sent to the RetrySet. Calling MyWorker.cancel! jid in model code throws an undefined variable error. How can I access that jid in the model? How can actually cancel or delete that specific job? Thanks!
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.
To run sidekiq, you will need to open a terminal, navigate to your application's directory, and start the sidekiq process, exactly as you would start a web server for the application itself. When the command executes you will see a message that sidekiq has started.
# The wiki code
class MyWorker
 include Sidekiq::Worker
 def perform(thing_id)
  return if cancelled?
  # do actual work
 end
 def cancelled?
  Sidekiq.redis {|c| c.exists("cancelled-#{jid}") }
 end
 def self.cancel!(jid)
  Sidekiq.redis {|c| c.setex("cancelled-#{jid}", 86400, 1) }
 end
end
# create job
jid = MyWorker.perform_async("foo")
# cancel job
MyWorker.cancel!(jid)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With