class AdvancedSneakersActiveJob::Support::LocateWorkersByQueues

Public Class Methods

new(queues) click to toggle source
# File lib/advanced_sneakers_activejob/support/locate_workers_by_queues.rb, line 6
def initialize(queues)
  @queues = queues.uniq.reject(&:blank?)
  @queues_without_workers = []
  @workers = []
end

Public Instance Methods

call() click to toggle source
# File lib/advanced_sneakers_activejob/support/locate_workers_by_queues.rb, line 12
def call
  detect_workers_for_queues!
  ensure_all_workers_found!

  @workers.uniq
end

Private Instance Methods

all_workers() click to toggle source
# File lib/advanced_sneakers_activejob/support/locate_workers_by_queues.rb, line 27
def all_workers
  @all_workers ||= Sneakers::Worker::Classes.activejob_workers
end
detect_workers_for_queues!() click to toggle source
# File lib/advanced_sneakers_activejob/support/locate_workers_by_queues.rb, line 31
def detect_workers_for_queues!
  @queues.each do |queue|
    matching_workers = all_workers.select { |klass| klass.queue_name.match?(queue_regex(queue)) }

    if matching_workers.any?
      @workers += matching_workers
    else
      @queues_without_workers << queue
    end
  end
end
ensure_all_workers_found!() click to toggle source
# File lib/advanced_sneakers_activejob/support/locate_workers_by_queues.rb, line 21
def ensure_all_workers_found!
  return if @queues_without_workers.empty?

  raise("Missing workers for queues: #{@queues_without_workers.join(', ')}")
end
queue_regex(queue) click to toggle source

www.rabbitmq.com/tutorials/tutorial-five-python.html

# File lib/advanced_sneakers_activejob/support/locate_workers_by_queues.rb, line 44
def queue_regex(queue)
  regex = Regexp.escape(queue)
                .gsub(/\A\\\*|(\.)\\\*/, '\1[^\.]+') # "*" (star) substitutes for exactly one word
                .sub('\.\#', '(\.[^\.]+)*') # "#" (hash) substitutes for zero or more words

  Regexp.new(['\A', regex, '\z'].join)
end