class Supervision::CircuitBreaker
A class responsible for protecting remote calls
Attributes
Public Class Methods
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
Define before handler
@api public
# File lib/supervision/circuit_breaker.rb, line 73 def before(&block) @before = block self end
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 circuit instance parameters
@yield [Configuration]
@api public
# File lib/supervision/circuit_breaker.rb, line 37 def configure(&block) control.config.configure(&block) end
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
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
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
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
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 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
Invoke before handler
@api private
# File lib/supervision/circuit_breaker.rb, line 123 def handle_before @before.call if @before end
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
Invoke success handler
@api private
# File lib/supervision/circuit_breaker.rb, line 130 def handle_success @on_success.call if @on_success end