class BeanstalkFarmer::Job

Attributes

args[RW]
job[RW]
name[RW]
response[RW]

Public Class Methods

handler_pool(reset=false) click to toggle source

A pool of job handlers that can work on jobs in our queue

@param [Boolean] reset (false) When true, our collection of job handlers

will be purged from memory

@return [Hash] the collection of job handlers

# File lib/beanstalk_farmer/job.rb, line 52
def self.handler_pool(reset=false)
  @pool   = nil if reset
  @pool ||= Hash.new
end
new(job) click to toggle source

@param [Beanstalk::Job] job A Beanstalk job that has been reserved to be

worked upon
# File lib/beanstalk_farmer/job.rb, line 12
def initialize(job)
  self.job = job
  set_name_and_arguments
  logger.info "JOB (#{name}) reserved"
end

Public Instance Methods

handler() click to toggle source

@return [#call] a class used to process the reserved job

# File lib/beanstalk_farmer/job.rb, line 19
def handler
  self.class.handler_pool[name]
end
method_missing(name, *args, &block) click to toggle source
Calls superclass method
# File lib/beanstalk_farmer/job.rb, line 32
def method_missing(name, *args, &block)
  if job.respond_to?(name)
    meth = job.method(name)

    if meth.arity > 0
      meth.call(args, &block)
    else
      meth.call
    end
  else
    super
  end
end
work() click to toggle source

Performs work for this job

# File lib/beanstalk_farmer/job.rb, line 24
def work
  do_some_work
rescue Timeout::Error
  handle_timeout!
ensure
  handle_job_response
end

Private Instance Methods

do_some_work() click to toggle source
# File lib/beanstalk_farmer/job.rb, line 63
def do_some_work
  Timeout.timeout(job.ttr) do
    logger.info "JOB (#{name}) working"
    self.response = handler.call(args)
  end
end
handle_job_response() click to toggle source
# File lib/beanstalk_farmer/job.rb, line 75
def handle_job_response
  if response.is_a?(Array) && !response.empty?
    logger.info "JOB (#{name}) done. Response: #{response.inspect}"
    job.public_send(*response)
  else
    logger.info "JOB (#{name}) done. Deleting by default."
    delete
  end
rescue NoMethodError => e
  logger.info "JOB (#{name}) done. Assuming delete from response: #{response.inspect}"
  delete
end
handle_timeout!() click to toggle source
# File lib/beanstalk_farmer/job.rb, line 70
def handle_timeout!
  logger.error "JOB (#{name}) out of time"
  raise TimedOut, "#{name} could not finish in #{job.ttr} seconds"
end
set_name_and_arguments() click to toggle source
# File lib/beanstalk_farmer/job.rb, line 59
def set_name_and_arguments
  self.name, self.args = MultiJson.decode(job.body)
end