class OneApm::Support::WorkerLoop

Attributes

iterations[R]
period[RW]
propagate_errors[RW]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/one_apm/support/event/worker_loop.rb, line 13
def initialize(opts = {})
  @should_run = true
  @next_invocation_time = Time.now
  @period = 60.0
  @duration = opts[:duration] if opts[:duration]
  @limit = opts[:limit] if opts[:limit]
  @iterations = 0
  @propagate_errors = opts.fetch(:propagate_errors, false)
end

Public Instance Methods

keep_running?() click to toggle source
# File lib/one_apm/support/event/worker_loop.rb, line 52
def keep_running?
  @should_run && under_duration? && under_limit?
end
run(period = nil, &block) click to toggle source
# File lib/one_apm/support/event/worker_loop.rb, line 34
def run(period = nil, &block)
  setup(period, block)
  while keep_running? do
    sleep_time = schedule_next_invocation
    sleep(sleep_time) if sleep_time > 0
    run_task if keep_running?
    @iterations += 1
  end
end
run_task() click to toggle source
# File lib/one_apm/support/event/worker_loop.rb, line 68
def run_task
  if @propagate_errors
    @task.call
  else
    begin
      @task.call
    rescue OneApm::ForceRestartException, OneApm::ForceDisconnectException
      raise
    rescue => e
      OneApm::Manager.logger.error "Error running task in Agent Worker Loop:", e
    end
  end
end
schedule_next_invocation() click to toggle source
# File lib/one_apm/support/event/worker_loop.rb, line 44
def schedule_next_invocation
  now = Time.now
  while @next_invocation_time <= now && @period > 0
    @next_invocation_time += @period
  end
  @next_invocation_time - Time.now
end
setup(period, task) click to toggle source
# File lib/one_apm/support/event/worker_loop.rb, line 23
def setup(period, task)
  @task = task
  @period = period if period
  @should_run = true
  @iterations = 0

  now = Time.now
  @deadline = now + @duration if @duration
  @next_invocation_time = (now + @period)
end
stop() click to toggle source
# File lib/one_apm/support/event/worker_loop.rb, line 64
def stop
  @should_run = false
end
under_duration?() click to toggle source
# File lib/one_apm/support/event/worker_loop.rb, line 56
def under_duration?
  !@deadline || Time.now < @deadline
end
under_limit?() click to toggle source
# File lib/one_apm/support/event/worker_loop.rb, line 60
def under_limit?
  @limit.nil? || @iterations < @limit
end