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