Module: Resque::Plugins::LonelyJob
- Defined in:
- lib/resque-lonely_job.rb,
lib/resque-lonely_job/version.rb
Defined Under Namespace
Modules: Version
Constant Summary collapse
- LOCK_TIMEOUT =
5 days
60 * 60 * 24 * 5
- VERSION =
Current gem version exposed at the traditional constant location.
Version::VERSION
Instance Method Summary collapse
- #around_perform(*args) ⇒ Object
- #before_perform(*args) ⇒ Object
- #can_lock_queue?(*args) ⇒ Boolean
- #lock_timeout ⇒ Object
-
#redis_key(*args) ⇒ Object
Overwrite this method to uniquely identify which mutex should be used for a resque worker.
- #reenqueue(*args) ⇒ Object
- #requeue_interval ⇒ Object
- #unlock_queue(*args) ⇒ Object
Instance Method Details
#around_perform(*args) ⇒ Object
56 57 58 59 60 61 62 |
# File 'lib/resque-lonely_job.rb', line 56 def around_perform(*args) begin yield ensure unlock_queue(*args) end end |
#before_perform(*args) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/resque-lonely_job.rb', line 43 def before_perform(*args) unless can_lock_queue?(*args) # Sleep so the CPU's rest sleep(requeue_interval) # can't get the lock, so re-enqueue the task reenqueue(*args) # and don't perform raise Resque::Job::DontPerform end end |
#can_lock_queue?(*args) ⇒ Boolean
23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/resque-lonely_job.rb', line 23 def can_lock_queue?(*args) now = Time.now.to_i key = redis_key(*args) timeout = lock_timeout # Per http://redis.io/commands/setnx return true if Resque.redis.setnx(key, timeout) return false if Resque.redis.get(key).to_i > now return true if Resque.redis.getset(key, timeout).to_i <= now false end |
#lock_timeout ⇒ Object
9 10 11 |
# File 'lib/resque-lonely_job.rb', line 9 def lock_timeout Time.now.to_i + LOCK_TIMEOUT + 1 end |
#redis_key(*args) ⇒ Object
Overwrite this method to uniquely identify which mutex should be used for a resque worker.
19 20 21 |
# File 'lib/resque-lonely_job.rb', line 19 def redis_key(*args) "lonely_job:#{@queue}" end |
#reenqueue(*args) ⇒ Object
39 40 41 |
# File 'lib/resque-lonely_job.rb', line 39 def reenqueue(*args) Resque.enqueue(self, *args) end |
#requeue_interval ⇒ Object
13 14 15 |
# File 'lib/resque-lonely_job.rb', line 13 def requeue_interval instance_variable_get(:@requeue_interval) || 1 end |
#unlock_queue(*args) ⇒ Object
35 36 37 |
# File 'lib/resque-lonely_job.rb', line 35 def unlock_queue(*args) Resque.redis.del(redis_key(*args)) end |