class Employer::Boss

Attributes

employees[R]
keep_going[R]
logger[R]
pipeline[R]
sleep_time[R]

Public Class Methods

new(logger) click to toggle source
# File lib/employer/boss.rb, line 7
def initialize(logger)
  @logger = logger
  @pipeline = Employer::Pipeline.new(logger)
  @employees = []
  @sleep_time_index = 0
end

Public Instance Methods

allocate_employee(employee) click to toggle source
# File lib/employer/boss.rb, line 18
def allocate_employee(employee)
  employees << employee
end
busy_employees() click to toggle source
# File lib/employer/boss.rb, line 100
def busy_employees
  employees.select { |employee| !employee.free? }
end
delegate_job(job) click to toggle source
# File lib/employer/boss.rb, line 94
def delegate_job(job)
  raise Employer::Errors::NoEmployeeFree unless employee = free_employee
  logger.info("Delegating job #{job.id} to employee #{employee.object_id}")
  employee.work(job)
end
delegate_work() click to toggle source
# File lib/employer/boss.rb, line 37
def delegate_work
  while free_employee? && job = get_work
    delegate_job(job)
  end
end
free_employee() click to toggle source
# File lib/employer/boss.rb, line 104
def free_employee
  employees.find(&:free?)
end
free_employee?() click to toggle source
# File lib/employer/boss.rb, line 108
def free_employee?
  free_employee
end
get_work() click to toggle source
# File lib/employer/boss.rb, line 43
def get_work
  sleep_times = [0.1, 0.5, 1, 2.5, 5]
  if job = pipeline.dequeue
    @sleep_time_index = 0
  else
    @sleep_time_index += 1 unless @sleep_time_index == (sleep_times.count - 1)
  end
  @sleep_time = sleep_times[@sleep_time_index]
  sleep(sleep_time)
  job
end
manage() click to toggle source
# File lib/employer/boss.rb, line 26
def manage
  @keep_going = true

  while keep_going
    delegate_work
    progress_update
  end

  wait_on_employees
end
pipeline_backend=(backend) click to toggle source
# File lib/employer/boss.rb, line 14
def pipeline_backend=(backend)
  pipeline.backend = backend
end
progress_update() click to toggle source
# File lib/employer/boss.rb, line 55
def progress_update
  busy_employees.each do |employee|
    update_job_status(employee)
  end
end
stop_employees() click to toggle source
# File lib/employer/boss.rb, line 86
def stop_employees
  busy_employees.each do |employee|
    employee.stop_working
    update_job_status(employee)
    employee.free
  end
end
stop_managing() click to toggle source
# File lib/employer/boss.rb, line 22
def stop_managing
  @keep_going = false
end
update_job_status(employee) click to toggle source
# File lib/employer/boss.rb, line 61
def update_job_status(employee)
  return if employee.work_in_progress?

  job = employee.job

  if employee.work_completed?
    pipeline.complete(job)
  elsif employee.work_failed?
    if job.try_again?
      pipeline.reset(job)
    else
      pipeline.fail(job)
    end
  end

  employee.free
end
wait_on_employees() click to toggle source
# File lib/employer/boss.rb, line 79
def wait_on_employees
  busy_employees.each do |employee|
    employee.wait_for_completion
    update_job_status(employee)
  end
end