class SwitchGearSidekiq::Middleware

Constants

VERSION

Attributes

breakers[R]

Public Class Methods

new(breakers:) click to toggle source
# File lib/switch_gear_sidekiq/middleware.rb, line 9
def initialize(breakers:)
  @breakers = breakers.each_with_object({}) do |breaker, hash|
    hash[breaker.worker] = breaker
  end
  run_validations
end

Public Instance Methods

call(worker, msg, queue, &block) click to toggle source
# File lib/switch_gear_sidekiq/middleware.rb, line 16
def call(worker, msg, queue, &block)
  breaker = breakers[worker.class]
  Sidekiq.logger.debug "Breaker being used: #{breaker}"

  breaker.call(block)
rescue SwitchGear::CircuitBreaker::OpenError
  retry_in = breaker.reset_timeout + 1
  fail_msg = "Circuit is open for worker: #{breaker.worker} - blocking all calls;"
  fail_msg += "  Jobs will try again in: #{retry_in} "
  Sidekiq.logger.warn fail_msg

  # Here we'll re-enqueue the job to be 1 second above the reset_timeout period
  worker.class.perform_in(retry_in, *msg['args'])
end

Private Instance Methods

run_validations() click to toggle source
# File lib/switch_gear_sidekiq/middleware.rb, line 33
def run_validations
  msg = "You must pass in an instance of a SwitchGear::CircuitBreaker"
  fail msg if breakers.any? { |klass, breaker| !breaker.is_a? SwitchGear::CircuitBreaker }
end