module Resque::Plugins::RateLimited

Constants

MUTEX
RESQUE_PREFIX

Public Instance Methods

around_perform_with_check_and_requeue(*params) { || ... } click to toggle source
# File lib/resque/plugins/rate_limited/rate_limited.rb, line 7
def around_perform_with_check_and_requeue(*params)
  paused = false
  with_lock do
    paused = paused?
    Resque.enqueue_to(paused_queue_name, self, *params) if paused
  end
  return if paused
  yield
end
find_class(klass) click to toggle source
# File lib/resque/plugins/rate_limited/rate_limited.rb, line 87
def find_class(klass)
  return klass if klass.is_a? Class
  return Object.const_get(klass) unless klass.include?('::')
  klass.split('::').reduce(Object) do |mod, class_name|
    mod.const_get(class_name)
  end
end
pause() click to toggle source
# File lib/resque/plugins/rate_limited/rate_limited.rb, line 50
def pause
  Resque.redis.renamenx(prefixed(@queue), prefixed(paused_queue_name))
  true
rescue Redis::CommandError => e
  raise unless e.message == 'ERR no such key'
  false
end
pause_until(timestamp) click to toggle source
# File lib/resque/plugins/rate_limited/rate_limited.rb, line 38
def pause_until(timestamp)
  UnPause.enqueue(timestamp, name) if pause
end
paused?(unknown = false) click to toggle source
# File lib/resque/plugins/rate_limited/rate_limited.rb, line 58
def paused?(unknown = false)
  # parameter is what to return if the queue is empty, and so the state is unknown
  if Resque.inline
    false
  elsif Resque.redis.exists(prefixed(@queue))
    false
  elsif Resque.redis.exists(prefixed(paused_queue_name))
    true
  else
    unknown
  end
end
paused_queue_name() click to toggle source
# File lib/resque/plugins/rate_limited/rate_limited.rb, line 71
def paused_queue_name
  "#{@queue}_paused".to_sym
end
prefixed(name) click to toggle source
# File lib/resque/plugins/rate_limited/rate_limited.rb, line 75
def prefixed(name)
  "#{RESQUE_PREFIX}#{name}"
end
rate_limited_enqueue(klass, *params) click to toggle source
# File lib/resque/plugins/rate_limited/rate_limited.rb, line 17
def rate_limited_enqueue(klass, *params)
  with_lock do
    if paused?
      Resque.enqueue_to(paused_queue_name, klass, *params)
    else
      Resque.enqueue_to(@queue, klass, *params)
    end
  end
end
rate_limited_requeue(klass, *params) click to toggle source
# File lib/resque/plugins/rate_limited/rate_limited.rb, line 27
def rate_limited_requeue(klass, *params)
  # if the queue is empty, this was the last job - so queue to the paused queue
  with_lock do
    if paused?(true)
      Resque.enqueue_to(paused_queue_name, klass, *params)
    else
      Resque.enqueue_to(@queue, klass, *params)
    end
  end
end
un_pause() click to toggle source
# File lib/resque/plugins/rate_limited/rate_limited.rb, line 42
def un_pause
  Resque.redis.renamenx(prefixed(paused_queue_name), prefixed(@queue))
  true
rescue Redis::CommandError => e
  raise unless e.message == 'ERR no such key'
  false
end
with_lock() { || ... } click to toggle source
# File lib/resque/plugins/rate_limited/rate_limited.rb, line 79
def with_lock
  if Resque.inline
    yield
  else
    RedisMutex.with_lock(MUTEX, block: 60, expire: 120) { yield }
  end
end