Class: Supervision::CircuitBreaker

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Timeout
Defined in:
lib/supervision/circuit_breaker.rb

Overview

A class responsible for protecting remote calls

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}, &block) ⇒ CircuitBreaker

Create a CircuitBreaker

Examples:

circuit = CircuitBreaker { ... }


22
23
24
25
26
27
28
29
30
# 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

Instance Attribute Details

#controlObject (readonly)

Returns the value of attribute control.



9
10
11
# File 'lib/supervision/circuit_breaker.rb', line 9

def control
  @control
end

#nameObject (readonly)

Returns the value of attribute name.



11
12
13
# File 'lib/supervision/circuit_breaker.rb', line 11

def name
  @name
end

Instance Method Details

#before(&block) ⇒ Object

Define before handler



73
74
75
76
# File 'lib/supervision/circuit_breaker.rb', line 73

def before(&block)
  @before = block
  self
end

#call(*args) ⇒ Object

Executes the dangerous call

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

in sync call for timeout


47
48
49
50
51
52
53
54
55
56
# 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 {|Configuration| ... } ⇒ Object

Configure circuit instance parameters

Yields:



37
38
39
# File 'lib/supervision/circuit_breaker.rb', line 37

def configure(&block)
  control.config.configure(&block)
end

#inspectString

Detailed string representation of this circuit

Returns:

  • (String)


105
106
107
# File 'lib/supervision/circuit_breaker.rb', line 105

def inspect
  "#<#{self.class.name}:#{object_id} @name=#{name}>"
end

#on_failure(&block) ⇒ Supervision::CircuitBreaker Also known as: on_open

Define failure handler



94
95
96
97
# File 'lib/supervision/circuit_breaker.rb', line 94

def on_failure(&block)
  @on_failure = block
  self
end

#on_success(&block) ⇒ Supervision::CircuitBreaker Also known as: on_closed

Define success handler



83
84
85
86
# File 'lib/supervision/circuit_breaker.rb', line 83

def on_success(&block)
  @on_success = block
  self
end

#reset!nil

Reset this circuit to closed state

Examples:

supervision.reset!

Returns:

  • (nil)


66
67
68
# File 'lib/supervision/circuit_breaker.rb', line 66

def reset!
  control.reset!
end

#to_sString

Detailed string representation of this circuit

Returns:

  • (String)


114
115
116
# File 'lib/supervision/circuit_breaker.rb', line 114

def to_s
  "#<#{self.class.name}:#{object_id} @name=#{name}>"
end