module Retriable

Name:

retriable.rb

Created by: GaddyGaddy

Description:

Public Class Methods

set_test_mode() click to toggle source
# File lib/utils/retriable.rb, line 58
def self.set_test_mode
  @@test_mode = true
end

Public Instance Methods

extract_options(array) click to toggle source
# File lib/utils/retriable.rb, line 54
def extract_options(array)
  array.last.is_a?(::Hash) ? array.pop : {}
end
with_retries(*args) { || ... } click to toggle source

This will catch any exception and retry twice (three tries total):

with_retries { ... }

This will catch any exception and retry four times (five tries total):

with_retries(:limit => 5) { ... }

This will catch a specific exception and retry once (two tries total):

with_retries(Some::Error, :limit => 2) { ... }

You can also sleep inbetween tries. This is helpful if you’re hoping that some external service recovers from its issues.

with_retries(Service::Error, :sleep => 1) { ... }
# File lib/utils/retriable.rb, line 29
def with_retries(*args, &block)

  options = extract_options args
  exceptions = args

  options[:limit] ||= 3
  options[:limit] = 0 if @@test_mode
  options[:sleep] ||= 0
  exceptions = [Exception] if exceptions.empty?

  retried = 0
  begin
    yield
  rescue *exceptions => e
    logger.warn "Could not do command, will retry. Error message is #{e.inspect.to_s}"
    if retried + 1 < options[:limit]
      retried += 1
      sleep options[:sleep]
      retry
    else
      raise e
    end
  end
end