Class: Knj::Retry

Inherits:
Object show all
Defined in:
lib/knj/retry.rb

Class Method Summary collapse

Class Method Details

.try(args = {}, &block) ⇒ Object



2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/knj/retry.rb', line 2

def self.try(args = {}, &block)
  raise "No block was given." if !block_given?
  
  args[:tries] = 3 if !args[:tries]
  tries = []
  error = nil
  
  args[:tries].to_i.downto(1) do |count|
    error = nil
    dobreak = false
    
    begin
      if args[:timeout]
        begin
          Timeout.timeout(args[:timeout]) do
            block.call
            dobreak = true
            break
          end
        rescue Timeout::Error => e
          doraise = e if count <= 1
          error = e
          sleep(args[:wait]) if args[:wait] and !doraise
        end
      else
        block.call
        dobreak = true
        break
      end
    rescue Exception => e
      if e.class == Interrupt
        raise e if !args.key?(:interrupt) or args[:interrupt]
      elsif e.class == SystemExit
        raise e if !args.key?(:exit) or args[:exit]
      elsif count <= 1 or (args.key?(:errors) and args[:errors].index(e.class) == nil)
        doraise = e
      elsif args.key?(:errors) and args[:errors].index(e.class) != nil
        #given error was in the :errors-array - do nothing. Maybe later it should be logged and returned in a stats-hash or something? - knj
      end
      
      error = e
      sleep(args[:wait]) if args[:wait] and !doraise
    end
    
    if doraise
      if args[:return_error]
        tries << {:error => error}
        return {
          :tries => tries,
          :result => false
        }
      else
        raise e
      end
    elsif error
      tries << {:error => error}
    end
    
    break if dobreak
  end
  
  res = true
  res = false if error
  
  return {
    :tries => tries,
    :result => res
  }
end