class Backburner::Job

A single backburner job which can be processed and removed by the worker

Attributes

args[RW]
body[RW]
name[RW]
task[RW]

Public Class Methods

new(task) click to toggle source

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)
# File lib/backburner/job.rb, line 22
    def initialize(task)
      @hooks = Backburner::Hooks
      @task = task
      @body = task.body.is_a?(Hash) ? task.body : Backburner.configuration.job_parser_proc.call(task.body)
      @name = body["class"] || body[:class]
      @args = body["args"] || body[:args]
      @ttr  = body["ttr"] || body[:ttr]
    rescue => ex # Job was not valid format
#      self.bury
#      raise JobFormatInvalid, "Job body could not be parsed: #{ex.inspect}"
    end

Public Instance Methods

__getobj__() click to toggle source

Sets the delegator object to the underlying beaneater job self.bury

Calls superclass method
# File lib/backburner/job.rb, line 36
def __getobj__
  __setobj__(@task)
  super
end
bury() click to toggle source
# File lib/backburner/job.rb, line 62
def bury
  @hooks.invoke_hook_events(job_name, :on_bury, *args)
  @task.bury
end
job_class() click to toggle source

Returns the class for the job handler

@example

job_class # => NewsletterSender
# File lib/backburner/job.rb, line 77
def job_class
  handler = try_job_class
  raise(JobNotFound, self.name) unless handler
  handler
end
process() click to toggle source

Processes a job and handles any failure, deleting the job once complete

@example

@task.process
# File lib/backburner/job.rb, line 46
def process      
  # Invoke before hook and stop if false
  res = @hooks.invoke_hook_events(job_name, :before_perform, *args)
  return false unless res
  # Execute the job
  @hooks.around_hook_events(job_name, :around_perform, *args) do
    timeout_job_after(@ttr > 1 ? @ttr - 1 : @ttr) { job_class.perform(*args) }
  end
  task.delete
  # Invoke after perform hook
  @hooks.invoke_hook_events(job_name, :after_perform, *args)
rescue => e
  @hooks.invoke_hook_events(job_name, :on_failure, e, *args)
  raise e
end
retry(count, delay) click to toggle source
# File lib/backburner/job.rb, line 67
def retry(count, delay)
  @hooks.invoke_hook_events(job_name, :on_retry, count, delay, *args)
  @task.release(delay: delay)
end

Protected Instance Methods

job_name() click to toggle source

Attempts to return a constantized job name, otherwise reverts to the name string

@example

job_name # => "SomeUnknownJob"
# File lib/backburner/job.rb, line 89
def job_name
  handler = try_job_class
  handler ? handler : self.name
end
timeout_job_after(secs) { || ... } click to toggle source

Timeout job within specified block after given time.

@example

timeout_job_after(3) { do_something! }
# File lib/backburner/job.rb, line 105
def timeout_job_after(secs, &block)
  begin
    Timeout::timeout(secs) { yield }
  rescue Timeout::Error => e
    raise JobTimeout, "#{name}(#{(@args||[]).join(', ')}) hit #{secs}s timeout.\nbacktrace: #{e.backtrace}"
  end
end
try_job_class() click to toggle source
# File lib/backburner/job.rb, line 94
def try_job_class
  constantize(self.name)
rescue NameError
  nil
end