class Gracefully::CircuitBreaker

Attributes

opened_date[R]

Public Class Methods

new(*args) click to toggle source
# 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

Public Instance Methods

close!() click to toggle source
# File lib/gracefully/circuit_breaker.rb, line 69
def close!
  @closed = true
end
closed?() click to toggle source
# File lib/gracefully/circuit_breaker.rb, line 49
def closed?
  @closed
end
execute(&block) click to toggle source
# 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
mark_failure() click to toggle source
# File lib/gracefully/circuit_breaker.rb, line 39
def mark_failure
  @health.mark_failure

  update!
end
mark_success() click to toggle source
# File lib/gracefully/circuit_breaker.rb, line 33
def mark_success
  @health.mark_success

  update!
end
open!() click to toggle source
# File lib/gracefully/circuit_breaker.rb, line 73
def open!
  @closed = false
  @opened_date = Time.now
end
open?() click to toggle source
# File lib/gracefully/circuit_breaker.rb, line 45
def open?
  closed?.!
end
try_close_period_passed?() click to toggle source
# File lib/gracefully/circuit_breaker.rb, line 53
def try_close_period_passed?
  opened_date && opened_date + @try_close_after < Time.now
end
update!() click to toggle source
# File lib/gracefully/circuit_breaker.rb, line 61
def update!
  if @health.healthy?
    close!
  else
    open!
  end
end

Private Instance Methods

clear_opened_date!() click to toggle source
# File lib/gracefully/circuit_breaker.rb, line 80
def clear_opened_date!
  @opened_date = nil
end