A [Resque][rq] plugin. Requires Resque 1.7.0.
If you want only one instance of your job queued at a time, extend it with Resque::Plugins::QueueLock. You will be able to enqueue another job if one is currently executing.
For example:
require 'resque/plugins/queue_lock'
class UpdateNetworkGraph
extend Resque::Plugins::QueueLock
def self.perform(repo_id)
heavy_lifting
end
end
If you want only one instance of your job to execute at a time, extend it with Resque::Plugins::ExecutionLock. You can optionally use resque-retry if you want to retry locked jobs without them failing.
For example:
require 'resque/plugins/execution_lock'
class UpdateNetworkGraph extend Resque::Plugins::Retry extend Resque::Plugins::ExecutionLock
@retry_exceptions = [ Resque::Plugins::ExecutionLock::JobIsLocked ]
def self.perform(repo_id) heavy_lifting end end
And in your resque initializer (config/resque.rb):
require 'resque/failure/multiple'
Resque::Failure::MultipleWithRetrySuppression.classes = [Resque::Plugins::ExecutionLock::JobIsLocked] Resque::Failure.backend = Resque::Failure::MultipleWithRetrySuppression