class Cuetip::Worker

Attributes

status[R]

Public Class Methods

new(group, id, queues) click to toggle source
# File lib/cuetip/worker.rb, line 13
def initialize(group, id, queues)
  @group = group
  @id = id
  @queues = queues
end

Public Instance Methods

request_exit!() click to toggle source
# File lib/cuetip/worker.rb, line 19
def request_exit!
  @exit_requested = true
  interrupt_sleep
end
run() click to toggle source
# File lib/cuetip/worker.rb, line 24
def run
  set_status('idle')
  loop do
    unless run_once
      interruptible_sleep(Cuetip.config.polling_interval + rand)
    end

    break if @exit_requested
  end
end
run_once() click to toggle source
# File lib/cuetip/worker.rb, line 35
def run_once
  set_status('polling')
  run_callbacks :poll do
    queued_job = silence do
      if @queues.any?
        scope = Cuetip::Models::QueuedJob.from_queues(@queues)
      else
        scope = Cuetip::Models::QueuedJob
      end
      scope.find_and_lock
    end

    if queued_job
      set_status("executing #{queued_job.job.id}")
      run_callbacks :execute do
        queued_job.job.execute
      end
      set_status('idle')
      true
    else
      set_status('idle')
      false
    end
  end
end

Private Instance Methods

interrupt_sleep() click to toggle source
# File lib/cuetip/worker.rb, line 75
def interrupt_sleep
  @sleep_interrupt&.close
end
interruptible_sleep(seconds) click to toggle source
# File lib/cuetip/worker.rb, line 68
def interruptible_sleep(seconds)
  sleep_check, @sleep_interrupt = IO.pipe
  IO.select([sleep_check], nil, nil, seconds)
  sleep_check.close
  @sleep_interrupt.close
end
set_status(status) click to toggle source
# File lib/cuetip/worker.rb, line 63
def set_status(status)
  @status = status
  @group&.set_process_name
end
silence(&block) click to toggle source
# File lib/cuetip/worker.rb, line 79
def silence(&block)
  if ActiveRecord::Base.logger
    ActiveRecord::Base.logger.silence(&block)
  else
    block.call
  end
end