Sha256: 5c719f2eab7098f0c7724c3464d9e61680cab0dbf08e13b1dfaa6e5b3554bc9d

Contents?: true

Size: 1.66 KB

Versions: 2

Compression:

Stored size: 1.66 KB

Contents

module Backburner
  # A single backburner job which can be processed and removed by the worker
  class Job
    include Backburner::Helpers

    # Raises when a job times out
    class JobTimeout < RuntimeError; end
    class JobNotFound < RuntimeError; end

    attr_accessor :task, :body, :name, :args

    # Construct a job to be parsed and processed
    #
    # task is a reserved object containing the json body in the form of
    #   { :class => "NewsletterSender", :args => ["foo@bar.com"] }
    #
    # @example
    #  Backburner::Job.new(payload)
    #
    def initialize(task)
      @task = task
      @body = task.body.is_a?(Hash) ? task.body : JSON.parse(task.body)
      @name, @args = body["class"], body["args"]
    end

    # Processes a job and handles any failure, deleting the job once complete
    #
    # @example
    #   @task.process
    #
    def process
      timeout_job_after(task.ttr - 1) { job_class.perform(*args) }
      task.delete
    end

    # Bury a job out of the active queue if that job fails
    def bury
      task.bury
    end

    protected

    # Returns the class for the job handler
    #
    # @example
    #   job_class # => NewsletterSender
    #
    def job_class
      handler = constantize(self.name) rescue nil
      raise(JobNotFound, self.name) unless handler
      handler
    end

    # Timeout job within specified block after given time.
    #
    # @example
    #   timeout_job_after(3) { do_something! }
    #
    def timeout_job_after(secs, &block)
      begin
        Timeout::timeout(secs) { yield }
      rescue Timeout::Error
        raise JobTimeout, "#{name} hit #{secs}s timeout"
      end
    end

  end # Job
end # Backburner

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
backburner-0.1.1 lib/backburner/job.rb
backburner-0.1.0 lib/backburner/job.rb