class Unleash::ScheduledExecutor

Attributes

interval[RW]
max_exceptions[RW]
name[RW]
retry_count[RW]
thread[RW]

Public Class Methods

new(name, interval, max_exceptions = 5) click to toggle source
# File lib/unleash/scheduled_executor.rb, line 5
def initialize(name, interval, max_exceptions = 5)
  self.name = name || ''
  self.interval = interval
  self.max_exceptions = max_exceptions
  self.retry_count = 0
  self.thread = nil
end

Public Instance Methods

exit() click to toggle source
# File lib/unleash/scheduled_executor.rb, line 38
def exit
  if self.running?
    Unleash.logger.warn "thread #{name} will exit!"
    self.thread.exit
    self.thread.join if self.running?
  else
    Unleash.logger.info "thread #{name} was already stopped!"
  end
end
run(&blk) click to toggle source
# File lib/unleash/scheduled_executor.rb, line 13
def run(&blk)
  self.thread = Thread.new do
    Thread.current[:name] = self.name

    Unleash.logger.debug "thread #{name} loop starting"
    loop do
      Unleash.logger.debug "thread #{name} sleeping for #{interval} seconds"
      sleep interval

      run_blk{ blk.call }

      if exceeded_max_exceptions?
        Unleash.logger.error "thread #{name} retry_count (#{self.retry_count}) exceeded " \
            "max_exceptions (#{self.max_exceptions}). Stopping with retries."
        break
      end
    end
    Unleash.logger.debug "thread #{name} loop ended"
  end
end
running?() click to toggle source
# File lib/unleash/scheduled_executor.rb, line 34
def running?
  self.thread.is_a?(Thread) && self.thread.alive?
end

Private Instance Methods

exceeded_max_exceptions?() click to toggle source
# File lib/unleash/scheduled_executor.rb, line 62
def exceeded_max_exceptions?
  self.retry_count > self.max_exceptions
end
run_blk() { |blk| ... } click to toggle source
# File lib/unleash/scheduled_executor.rb, line 50
def run_blk(&blk)
  Unleash.logger.debug "thread #{name} starting execution"

  yield(blk)
  self.retry_count = 0
rescue StandardError => e
  self.retry_count += 1
  Unleash.logger.error "thread #{name} threw exception #{e.class} " \
      " (#{self.retry_count}/#{self.max_exceptions}): '#{e}'"
  Unleash.logger.debug "stacktrace: #{e.backtrace}"
end