Sha256: 4a569b7a7e7103590cb85b172bf210e9876909980b8da6821568d9b911852a17

Contents?: true

Size: 935 Bytes

Versions: 2

Compression:

Stored size: 935 Bytes

Contents

require "delegate"
class Backoff < Delegator
  def self.wrap(object, exception_classes, logger, options)
    return object if object.is_a?(self.class)
    new(object, exception_classes, logger, options)
  end

  def initialize(object, exception_classes, logger, options = {})
    @exception_classes = exception_classes
    @delegate_sd_obj = object
    @logger = logger
    @sleeper = options[:sleeper] || Kernel.method(:sleep)
    @initial_backoff = options[:initial_backoff] || 1
    @multiplier = options[:multiplier] || 2
  end

  def __getobj__
    @delegate_sd_obj
  end

  def method_missing(sym, *args, &block)
    _with_backoff { super }
  end

  def _with_backoff(backoff = @initial_backoff)
    yield
  rescue *@exception_classes => e
    @logger.error "Got #{e.class}, sleeping #{backoff}"
    @sleeper.call(backoff)
    @logger.info "Woke up after #{e.class} retrying again"
    backoff *= @multiplier
    retry
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
backoff-0.1.1 lib/backoff.rb
backoff-0.1.0 lib/backoff.rb