Class: HalClient::Retryinator

Inherits:
Object
  • Object
show all
Defined in:
lib/hal_client/retryinator.rb

Overview

Example usage: Retryinator.call { fetch_http_response }

Constant Summary collapse

DEFAULT_MAX_TRIES =
3
DEFAULT_DURATION =
1

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Retryinator

Returns a new instance of Retryinator.



19
20
21
22
23
# File 'lib/hal_client/retryinator.rb', line 19

def initialize(options={})
  @max_tries = options.fetch(:max_tries, DEFAULT_MAX_TRIES)
  @duration = options.fetch(:duration, DEFAULT_DURATION)
  @logger = options.fetch(:logger, HalClient::NullLogger.new)
end

Instance Attribute Details

#durationObject (readonly)

Returns the value of attribute duration.



14
15
16
# File 'lib/hal_client/retryinator.rb', line 14

def duration
  @duration
end

#loggerObject (readonly)

Returns the value of attribute logger.



14
15
16
# File 'lib/hal_client/retryinator.rb', line 14

def logger
  @logger
end

#max_triesObject (readonly)

Returns the value of attribute max_tries.



14
15
16
# File 'lib/hal_client/retryinator.rb', line 14

def max_tries
  @max_tries
end

Instance Method Details

#retryable(&block) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/hal_client/retryinator.rb', line 25

def retryable(&block)
  current_try = 1

  loop do
    begin
      result = yield block

      if server_error?(result.code)
        logger.warn "Received a #{result.code} response with body:\n#{result.body}"
        return result if current_try >= max_tries
      else
        return result
      end
    rescue HttpError => e
      logger.warn "Encountered an HttpError: #{e.message}"
      raise e if current_try >= max_tries
    end

    logger.warn "Failed attempt #{current_try} of #{max_tries}. " +
                  "Waiting #{duration} seconds before retrying"

    current_try += 1
    sleep duration
  end
end

#server_error?(status_code) ⇒ Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/hal_client/retryinator.rb', line 51

def server_error?(status_code)
  500 <= status_code && status_code < 600
end