class SimpleCircuit

Constants

VERSION

Attributes

logger[R]
max_failures[R]
payload[R]
retry_in[R]

Public Class Methods

new(payload:, max_failures: 100, retry_in: 60, logger: nil) click to toggle source
# File lib/simple_circuit.rb, line 4
def initialize(payload:, max_failures: 100, retry_in: 60, logger: nil)
  @payload      = payload
  @max_failures = max_failures
  @retry_in     = retry_in
  @logger       = logger

  @mutex = Mutex.new

  close
end

Public Instance Methods

closed?() click to toggle source
# File lib/simple_circuit.rb, line 32
def closed?
  @closed
end
open?() click to toggle source
# File lib/simple_circuit.rb, line 28
def open?
  !closed?
end
pass(message, *args) click to toggle source
# File lib/simple_circuit.rb, line 15
def pass(message, *args)
  fail @e if open? && !time_to_retry?
  result = payload.public_send(message, *args)
  close if open?
  result
rescue => e
  raise e if open?
  @e = e
  @mutex.synchronize{ @failures[e.class] += 1 }
  break! if @failures[e.class] > max_failures
  raise e
end

Private Instance Methods

break!() click to toggle source
# File lib/simple_circuit.rb, line 43
def break!
  @closed = false
  @broken_at = Time.now
  logger&.warn('#{self} has been broken')
end
close() click to toggle source
# File lib/simple_circuit.rb, line 49
def close
  @closed = true
  @failures = Hash.new(0)
end
time_to_retry?() click to toggle source
# File lib/simple_circuit.rb, line 54
def time_to_retry?
  @broken_at + retry_in < Time.now
end