module Resque::DynamicQueues

def get_next_job(grouped_queues)

def get_next_job(grouped_queues)
  @n ||= 0
  low_priority_queues = []
  high_priority_queues = []
  # Categorize queues as low_priority if its appinstance id is lower than current
  grouped_queues.sort_by { |app_instance_id, _| app_instance_id.to_i }.each do |app_instance_queues|
    app_instance_id, queues = app_instance_queues
    queues = get_categorized_queues(queues).to_h.values.flatten
    app_instance_id.to_i <= @n ? low_priority_queues.push(queues) : high_priority_queues.push(queues)
  end
  # Reorder queue groups by putting high priority queues in the front
  grouped_queues =
    (high_priority_queues + low_priority_queues).
    flatten.
    delete_if { |queue| !should_work_on_queue?(queue) }.
    map { |queue| "queue:#{queue}" }
  queue, payload = get_job_from_queues(grouped_queues)
  return nil if queue.blank?
  
  queue = queue.split("queue:")[1]
  # track last app instance id
  @n = queue.split('_').first.to_i
  return create_job(queue, Resque.decode(payload))      
end