class Medreg::ResilientLoop

Attributes

nr_retries[W]
nr_skipped[R]
state_file[R]
state_id[R]

Public Class Methods

new(loopname, state_id = nil) click to toggle source
# File lib/medreg/resilient_loop.rb, line 38
def initialize(loopname, state_id = nil)
  @loopname   = loopname
  @state_id   = state_id
  @nr_skipped = 0
  @nr_retries = 3
  get_state
end

Public Instance Methods

finished() click to toggle source
# File lib/medreg/resilient_loop.rb, line 73
def finished
  clear_state
end
must_skip?(id) click to toggle source
# File lib/medreg/resilient_loop.rb, line 46
def must_skip?(id)
  return false unless @state_id
  if id 
    clear_state if id.to_s.eql?(@state_id.to_s)
    @nr_skipped += 1        
    return true
  else
    return false
  end
end
try_run(state, timeout_in_secs = 10, &block) click to toggle source
# File lib/medreg/resilient_loop.rb, line 57
def try_run(state, timeout_in_secs = 10, &block)
  idx = 0
  while idx < @nr_retries
    idx += 1
    begin
      status = timeout(timeout_in_secs) do
        block.call
        save_state(state)
        return
      end
    rescue Timeout::Error
      raise Timeout::Error if @nr_retries == idx
    end
  end
end

Private Instance Methods

clear_state() click to toggle source
# File lib/medreg/resilient_loop.rb, line 89
def clear_state
  @state_id = nil
  FileUtils.rm_f(@state_file)
end
get_state() click to toggle source
# File lib/medreg/resilient_loop.rb, line 77
def get_state
  @state_file = File.join(LOG_PATH, @loopname + '.state')
  if File.exists?(@state_file)
    content = IO.read(@state_file)
    eval("@state_id = #{content}")
  else
    @state_id = nil
  end
end
save_state(state) click to toggle source
# File lib/medreg/resilient_loop.rb, line 86
def save_state(state)
  File.open(@state_file, 'w+') { |f| f.write(state)}
end