class Ayl::Beanstalk::Worker

Public Class Methods

new(host='localhost', port=11300) click to toggle source
# File lib/ayl-beanstalk/worker.rb, line 9
def initialize(host='localhost', port=11300)
  logger.debug "#{self.class.name}.initialize(#{host.inspect}, #{port})"
  @host = host
  @port = port
end

Public Instance Methods

process_messages() click to toggle source
# File lib/ayl-beanstalk/worker.rb, line 15
def process_messages
  logger.debug "#{self.class.name} entering process_messages loop watching: #{Ayl::MessageOptions.default_queue_name}"

  # Set the queue that we will be watching
  pool.tubes.watch!(Ayl::MessageOptions.default_queue_name)

  reserve_job do | job |
    begin

      process_message(job.ayl_message) unless job.ayl_message.nil?
      job.ayl_delete

    rescue SystemExit

      # This exception is raised when 'Kernel.exit' is called. In this case
      # we want to make sure the job is deleted, then we simply re-raise
      # the exception and we go bye-bye.
      job.ayl_delete
      raise

    rescue Ayl::Beanstalk::RequiresJobDecay => ex

      # The code in the message body has requested that we throw this job back
      # in the queue with a delay.
      job.ayl_decay(ex.delay)

    rescue Ayl::Beanstalk::RequiresJobBury => ex
      
      # The code in the message body has requested that we throw this job
      # into the 'buried' state. This will allow a human to look the job
      # over and determine if it can be processed
      job.ayl_bury

    rescue Exception => ex

      deal_with_unexpected_exception(job, ex)

    end

  end # reserve_job...

end

Private Instance Methods

deal_with_unexpected_exception(job, ex) click to toggle source

Deals with the decision to decay or delete job when an unexpected exception is encountered.

# File lib/ayl-beanstalk/worker.rb, line 99
def deal_with_unexpected_exception(job, ex)
  logger.error "Unexpected exception in process_messages: #{ex}\n#{ex.backtrace.join("\n")}"
  case job.ayl_message.options.failed_job_handler
  when 'decay'
    job.handle_decay(ex)
  when 'delete'
    job.ayl_delete
    Ayl::Mailer.instance.deliver_message("Exception in process_messages. Job deleted.", ex)
  when 'bury'
    job.ayl_bury
    Ayl::Mailer.instance.deliver_message("Exception in process_messages. Job buried", ex)
  else
    Ayl::Mailer.instance.deliver_message("Invalid failed job handler specified: #{job.ayl_message.options.failed_job_handler}", ex)
  end
end
reserve_job() { |job| ... } click to toggle source

The main loop that gets job from the beanstalk queue to process. When a job is received it will be passed to the block for this method.

# File lib/ayl-beanstalk/worker.rb, line 64
def reserve_job
  while true
    job = nil

    begin

      # Sit around and wait for a job to become available
      job = pool.tubes.reserve

    rescue Exception => ex

      logger.error "Unexpected exception in reserve_job: #{ex}\n#{ex.backtrace.join("\n")}"
      Ayl::Mailer.instance.deliver_message("Unexpected exception in process_messages.", ex)
      job.ayl_delete unless job.nil?

      # Notice that we are just breaking out of the loop here. Why?
      # Think about the kinds of exceptions that occur here. They will be
      # things like Beanstalk::OUT_OF_MEMORY errors, beanstalkd connection
      # errors, etc. At this point, the worker is finished, kaput. Might as
      # well report and die. That's exactly what will happen.
      break
      
    end

    break if job.nil?

    yield job

  end
end