class Supervision::CircuitBreaker

A class responsible for protecting remote calls

Attributes

control[R]
name[R]

Public Class Methods

new(options = {}, &block) click to toggle source

Create a CircuitBreaker

@example

circuit = CircuitBreaker { ... }

@api public

# File lib/supervision/circuit_breaker.rb, line 22
def initialize(options = {}, &block)
  if block.nil?
    raise InvalidParameterError, 'CircuitBreaker.new requires a block'
  end
  @name    = options.delete(:name)
  @control = CircuitControl.new(options)
  @circuit = Atomic.new(block)
  @mutex   = Mutex.new
end

Public Instance Methods

before(&block) click to toggle source

Define before handler

@api public

# File lib/supervision/circuit_breaker.rb, line 73
def before(&block)
  @before = block
  self
end
call(*args) click to toggle source

Executes the dangerous call

# TODO: this should distribute calls so we don't wait

in sync call for timeout

@api public

# File lib/supervision/circuit_breaker.rb, line 47
def call(*args)
  handle_before
  begin
    result = dispatch(*args)
    handle_success
    result
  rescue Exception => error
    handle_failure(error)
  end
end
configure(&block) click to toggle source

Configure circuit instance parameters

@yield [Configuration]

@api public

# File lib/supervision/circuit_breaker.rb, line 37
def configure(&block)
  control.config.configure(&block)
end
inspect() click to toggle source

Detailed string representation of this circuit

@return [String]

@api public

# File lib/supervision/circuit_breaker.rb, line 105
def inspect
  "#<#{self.class.name}:#{object_id} @name=#{name}>"
end
on_closed(&block)
Alias for: on_success
on_failure(&block) click to toggle source

Define failure handler

@return [Supervision::CircuitBreaker]

@api public

# File lib/supervision/circuit_breaker.rb, line 94
def on_failure(&block)
  @on_failure = block
  self
end
Also aliased as: on_open
on_open(&block)
Alias for: on_failure
on_success(&block) click to toggle source

Define success handler

@return [Supervision::CircuitBreaker]

@api public

# File lib/supervision/circuit_breaker.rb, line 83
def on_success(&block)
  @on_success = block
  self
end
Also aliased as: on_closed
reset!() click to toggle source

Reset this circuit to closed state

@example

supervision.reset!

@return [nil]

@api public

# File lib/supervision/circuit_breaker.rb, line 66
def reset!
  control.reset!
end
to_s() click to toggle source

Detailed string representation of this circuit

@return [String]

@api public

# File lib/supervision/circuit_breaker.rb, line 114
def to_s
  "#<#{self.class.name}:#{object_id} @name=#{name}>"
end

Private Instance Methods

dispatch(*args) click to toggle source

Dispatch message to the current circuit

@api private

# File lib/supervision/circuit_breaker.rb, line 145
def dispatch(*args)
  result = timeout(control.call_timeout) do
    @circuit.value.call(*args)
  end
  control.record_success
  result
end
handle_before() click to toggle source

Invoke before handler

@api private

# File lib/supervision/circuit_breaker.rb, line 123
def handle_before
  @before.call if @before
end
handle_failure(error) click to toggle source

Invoke failure handler and instrument circuit controller

@api private

# File lib/supervision/circuit_breaker.rb, line 137
def handle_failure(error)
  control.handle_failure(error)
  @on_failure.call(error) if @on_failure
end
handle_success() click to toggle source

Invoke success handler

@api private

# File lib/supervision/circuit_breaker.rb, line 130
def handle_success
  @on_success.call if @on_success
end