module Resque::DynamicQueues

def reserve_with_round_robin

def reserve_with_round_robin
  grouped_queues = queues.sort.group_by{|u| /(\d{1,20})_.*/.match(u) ? /(\d{1,20})_.*/.match(u).captures.first : nil}
  #Instance queue grouping
  if !grouped_queues.keys.include?(nil) && grouped_queues.keys.size > 0
    @n ||= 0
    @n += 1
    @n = @n % grouped_queues.keys.size
    grouped_queues.keys.rotate(@n).each do |key|
      grouped_queues[key].each do |queue|
        log! "Checking #{queue}"
        if should_work_on_queue?(queue) && @job_in_progress = Resque::Job.reserve(queue)
          log! "Found job on #{queue}"
          return @job_in_progress
        end
      end
      @n += 1 # Start the next search at the queue after the one from which we pick a job.
    end
    nil
  else 
    return reserve_without_round_robin
  end
  
rescue Exception => e
  log "Error reserving job: #{e.inspect}"
  log e.backtrace.join("\n")
  raise e
end