Class: Gracefully::CircuitBreaker
- Inherits:
-
Object
- Object
- Gracefully::CircuitBreaker
show all
- Defined in:
- lib/gracefully/circuit_breaker.rb
Defined Under Namespace
Classes: CurrentlyOpenError
Instance Attribute Summary collapse
Instance Method Summary
collapse
Constructor Details
Returns a new instance of CircuitBreaker.
[View source]
5
6
7
8
9
10
11
12
13
14
|
# File 'lib/gracefully/circuit_breaker.rb', line 5
def initialize(*args)
if args.size > 0
options = args.first
@try_close_after = options[:try_close_after]
end
@closed = true
@health = options && options[:health] || Gracefully::ConsecutiveFailuresBasedHealth.new(become_unhealthy_after_consecutive_failures: 0)
end
|
Instance Attribute Details
permalink
#opened_date ⇒ Object
Returns the value of attribute opened_date.
3
4
5
|
# File 'lib/gracefully/circuit_breaker.rb', line 3
def opened_date
@opened_date
end
|
Instance Method Details
[View source]
69
70
71
|
# File 'lib/gracefully/circuit_breaker.rb', line 69
def close!
@closed = true
end
|
permalink
#closed? ⇒ Boolean
[View source]
49
50
51
|
# File 'lib/gracefully/circuit_breaker.rb', line 49
def closed?
@closed
end
|
permalink
#execute(&block) ⇒ Object
[View source]
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
# File 'lib/gracefully/circuit_breaker.rb', line 16
def execute(&block)
if open? && (@try_close_after.nil? || try_close_period_passed?.!)
raise CurrentlyOpenError, "Opened at #{opened_date}"
end
clear_opened_date!
begin
v = block.call
mark_success
v
rescue => e
mark_failure
raise e
end
end
|
permalink
#mark_failure ⇒ Object
[View source]
39
40
41
42
43
|
# File 'lib/gracefully/circuit_breaker.rb', line 39
def mark_failure
@health.mark_failure
update!
end
|
permalink
#mark_success ⇒ Object
[View source]
33
34
35
36
37
|
# File 'lib/gracefully/circuit_breaker.rb', line 33
def mark_success
@health.mark_success
update!
end
|
[View source]
73
74
75
76
|
# File 'lib/gracefully/circuit_breaker.rb', line 73
def open!
@closed = false
@opened_date = Time.now
end
|
[View source]
45
46
47
|
# File 'lib/gracefully/circuit_breaker.rb', line 45
def open?
closed?.!
end
|
permalink
#try_close_period_passed? ⇒ Boolean
[View source]
53
54
55
|
# File 'lib/gracefully/circuit_breaker.rb', line 53
def try_close_period_passed?
opened_date && opened_date + @try_close_after < Time.now
end
|
[View source]
61
62
63
64
65
66
67
|
# File 'lib/gracefully/circuit_breaker.rb', line 61
def update!
if @health.healthy?
close!
else
open!
end
end
|