class Rhod::Command

Constants

EXCEPTIONS

Public Class Methods

execute(*args, &block) click to toggle source

Class methods

# File lib/rhod/command.rb, line 24
def self.execute(*args, &block)
  this = self.new(*args, &block)
  this.execute
end
new(*args, &block) click to toggle source
# File lib/rhod/command.rb, line 5
def initialize(*args, &block)
  opts            = args[-1].kind_of?(Hash) ? args.pop : {}
  @env = {
    :args           => args || [],
    :request        => block,
    :retries        => opts[:retries] || 0,
    :attempts       => 0,
    :logger         => opts[:logger],
    :backoffs       => Rhod::Backoffs.backoff_sugar_to_enumerator(opts[:backoffs]) || Rhod::Backoffs::Logarithmic.new(1.3),
    :fallback       => opts[:fallback],
    :pool           => opts[:pool],
    :exceptions     => opts[:exceptions] || EXCEPTIONS,
    :profile_name   => opts[:profile_name],
    :middleware     => opts[:middleware_stack] || Rhod::Middleware.new,
  }
end

Public Instance Methods

call_middleware_after_request() click to toggle source
# File lib/rhod/command.rb, line 68
def call_middleware_after_request
  @env = @env[:middleware].on(:after, @env)
end
call_middleware_before_request() click to toggle source
# File lib/rhod/command.rb, line 64
def call_middleware_before_request
  @env = @env[:middleware].on(:before, @env)
end
call_middleware_on_error() click to toggle source
# File lib/rhod/command.rb, line 72
def call_middleware_on_error
  @env = @env[:middleware].on(:error, @env)
end
call_middleware_on_failure() click to toggle source
# File lib/rhod/command.rb, line 76
def call_middleware_on_failure
  @env = @env[:middleware].on(:failure, @env)
end
execute() click to toggle source

Instance methods

# File lib/rhod/command.rb, line 31
def execute
  begin
    if @env[:pool]
      @env[:pool].with do |conn|
        @env[:args] = [conn].concat(@env[:args])

        call_middleware_before_request
        @env[:result] = @env[:request].call(*@env[:args])
        call_middleware_after_request
        @env[:result]
      end
    else
      call_middleware_before_request
      @env[:result] = @env[:request].call(*@env[:args])
      call_middleware_after_request
      @env[:result]
    end
  rescue *@env[:exceptions] => e
    @env[:attempts] += 1
    @env[:next_attempt] = @env[:backoffs].next
    if @env[:attempts] <= @env[:retries]
      @env[:logger].warn("Rhod - Caught an exception: #{e.message}.  Attempt #{@env[:attempts]} in #{sprintf("%.2f", @env[:next_attempt])} secs") if @env[:logger] && @env[:logger].respond_to?(:warn)
      call_middleware_on_error
      sleep(@env[:next_attempt])
      retry
    else
      call_middleware_on_failure
      return @env[:fallback].call(*@env[:args]) if @env[:fallback]
      raise
    end
  end
end