Module: AdvancedSneakersActiveJob

Defined in:
lib/advanced_sneakers_activejob.rb,
lib/advanced_sneakers_activejob/errors.rb,
lib/advanced_sneakers_activejob/handler.rb,
lib/advanced_sneakers_activejob/railtie.rb,
lib/advanced_sneakers_activejob/version.rb,
lib/advanced_sneakers_activejob/publisher.rb,
lib/advanced_sneakers_activejob/content_type.rb,
lib/advanced_sneakers_activejob/configuration.rb,
lib/advanced_sneakers_activejob/active_job_patch.rb,
lib/advanced_sneakers_activejob/workers_registry.rb,
lib/advanced_sneakers_activejob/delayed_publisher.rb,
lib/advanced_sneakers_activejob/exponential_backoff.rb,
lib/advanced_sneakers_activejob/support/locate_workers_by_queues.rb

Overview

Advanced Sneakers adapter for ActiveJob

Defined Under Namespace

Modules: ActiveJobPatch, Support Classes: Configuration, DelayedPublisher, Handler, PublishError, Publisher, Railtie, WorkersRegistry

Constant Summary collapse

VERSION =
'0.6.0'
CONTENT_TYPE =
'application/vnd.activejob+json'
EXPONENTIAL_BACKOFF =

Calculating exponential backoff by formulas with randomization leads to numerous RabbitMQ queues.

{
  1 => 3,       # 3 seconds
  2 => 30,      # 30 seconds
  3 => 90,      # 1.5 minutes
  4 => 240,     # 4 minutes
  5 => 600,     # 10 minutes
  6 => 1200,    # 20 minutes
  7 => 2400,    # 40 minutes
  8 => 3600,    # 1 hour
  9 => 7200,    # 2 hours
  10 => 10_800, # 3 hours
  11 => 14_400, # 4 hours
  12 => 21_600, # 6 hours
  13 => 28_800, # 8 hours
  14 => 36_000, # 10 hours
  15 => 50_400, # 14 hours
  16 => 64_800, # 18 hours
  17 => 86_400  # 24 hours
}.tap { |h| h.default = 86_400 }.freeze

Class Method Summary collapse

Class Method Details

.configObject



40
41
42
# File 'lib/advanced_sneakers_activejob.rb', line 40

def config
  @config ||= Configuration.new
end

.configure {|config| ... } ⇒ Object

Yields:



44
45
46
# File 'lib/advanced_sneakers_activejob.rb', line 44

def configure
  yield config
end

.const_missing(name) ⇒ Object



85
86
87
88
89
# File 'lib/advanced_sneakers_activejob.rb', line 85

def const_missing(name)
  Sneakers::Worker::Classes.define_active_job_consumers

  constants.include?(name) ? const_get(name) : super
end

.consumer_name(queue_name:) ⇒ Object

Based on ActiveSupport::Inflector#parameterize



70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/advanced_sneakers_activejob.rb', line 70

def consumer_name(queue_name:)
  # replace accented chars with their ascii equivalents
  parameterized_string = ::ActiveSupport::Inflector.transliterate(queue_name)
  # Turn unwanted chars into the separator
  parameterized_string.gsub!(/[^a-z0-9\-_]+/, '_')
  # No more than one of the separator in a row.
  parameterized_string.gsub!(/_{2,}/, '_')
  # Remove leading/trailing separator.
  parameterized_string.gsub!(/^_|_$/, '')
  # Ruby does not allow classes with leading digits
  parameterized_string.gsub!(/\A(\d)/, 'queue\1')

  [parameterized_string, 'consumer'].join('_').classify
end

.define_consumer(queue_name:) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/advanced_sneakers_activejob.rb', line 48

def define_consumer(queue_name:)
  name = consumer_name(queue_name: queue_name)

  return const_get(name) if const_defined?(name)

  klass = Class.new(ActiveJob::QueueAdapters::AdvancedSneakersAdapter::JobWrapper)
  const_set(name, klass)
  klass.include Sneakers::Worker
  klass.from_queue(queue_name, config.sneakers)

  klass
end

.delayed_publisherObject



65
66
67
# File 'lib/advanced_sneakers_activejob.rb', line 65

def delayed_publisher
  @delayed_publisher ||= AdvancedSneakersActiveJob::DelayedPublisher.new(**config.publisher_config)
end

.publisherObject



61
62
63
# File 'lib/advanced_sneakers_activejob.rb', line 61

def publisher
  @publisher ||= AdvancedSneakersActiveJob::Publisher.new(**config.publisher_config)
end