class Resque::Plugins::JobHistory::Job

a class encompassing a single job.

Attributes

job_id[RW]

Public Class Methods

new(class_name, job_id) click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 12
def initialize(class_name, job_id)
  super(class_name)

  @stored_values = nil
  @job_id        = job_id
end

Public Instance Methods

abort() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 102
def abort
  running_jobs.remove_job(job_id)

  reset
end
args() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 47
def args
  decode_args(stored_values[:args])
end
blank?() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 31
def blank?
  !redis.exists job_key
end
cancel(caller_message = nil, start_time = nil, *args) click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 108
def cancel(caller_message = nil, start_time = nil, *args)
  if start_time.present?
    record_job_start(start_time, *args)
  end

  if present?
    redis.hset(job_key,
               "error",
               "Unknown - Job failed to signal ending after the configured purge time or was canceled manually.#{caller_message}")
  end

  redis.incr(total_failed_key)

  finish
end
duration() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 39
def duration
  (end_time || Time.now) - (start_time || Time.now)
end
end_time() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 43
def end_time
  stored_values[:end_time].try(:to_time)
end
error() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 59
def error
  stored_values[:error]
end
failed(exception, start_time = nil, *args) click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 91
def failed(exception, start_time = nil, *args)
  if start_time.present?
    record_job_start(start_time, *args)
  end

  redis.hset(job_key, "error", exception_message(exception)) if present?
  redis.incr(total_failed_key)

  finish
end
finish(start_time = nil, *args) click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 74
def finish(start_time = nil, *args)
  if start_time.present?
    record_job_start(start_time, *args)
  end

  if present?
    redis.hset(job_key, "end_time", Time.now.utc.to_s)
    finished_jobs.add_job(job_id, class_name)
  end

  running_jobs.remove_job(job_id)

  reset

  self
end
finished?() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 27
def finished?
  stored_values[:end_time].present?
end
job_key() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 19
def job_key
  "#{job_history_base_key}.#{job_id}"
end
purge() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 138
def purge
  # To keep the counts honest...
  abort unless finished?

  remove_from_job_lists

  redis.del(job_key)

  reset
end
retry() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 124
def retry
  return unless described_class

  Resque.enqueue described_class, *args
end
safe_purge() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 130
def safe_purge
  return if running_jobs.includes_job?(job_id)
  return if finished_jobs.includes_job?(job_id)
  return if linear_jobs.includes_job?(job_id)

  purge
end
start(*args) click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 63
def start(*args)
  record_job_start(Time.now.utc.to_s, *args)

  num_jobs = running_jobs.add_job(job_id, class_name)
  linear_jobs.add_job(job_id, class_name) unless class_exclude_from_linear_history

  record_num_jobs(num_jobs)

  self
end
start_time() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 23
def start_time
  stored_values[:start_time].try(:to_time)
end
succeeded?() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 35
def succeeded?
  error.blank?
end
uncompressed_args() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 51
def uncompressed_args
  return args if described_class.blank? || args.blank?
  return args unless described_class.singleton_class.included_modules.map(&:name).include?("Resque::Plugins::Compressible")
  return args unless described_class.compressed?(args)

  described_class.uncompressed_args(args.first[:payload] || args.first["payload"])
end

Private Instance Methods

decode_args(args_string) click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 180
def decode_args(args_string)
  Resque.decode(args_string)
end
encode_args(*args) click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 176
def encode_args(*args)
  Resque.encode(args)
end
exception_message(exception) click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 151
def exception_message(exception)
  if exception.is_a?(Resque::DirtyExit)
    "#{exception.message}\n\n#{exception.process_status.to_s}".strip
  else
    exception.message
  end
end
record_job_start(start_time, *args) click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 165
def record_job_start(start_time, *args)
  redis.hset(job_key, "start_time", start_time)
  redis.hset(job_key, "args", encode_args(*args))

  reset
end
record_num_jobs(num_jobs) click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 184
def record_num_jobs(num_jobs)
  if redis.get(max_running_key).to_i < num_jobs
    redis.set(max_running_key, num_jobs)
  end

  return unless num_jobs >= class_history_len

  clean_old_running_jobs
end
remove_from_job_lists() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 159
def remove_from_job_lists
  running_jobs.remove_job(job_id)
  finished_jobs.remove_job(job_id)
  linear_jobs.remove_job(job_id)
end
reset() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 194
def reset
  @stored_values = nil
end
stored_values() click to toggle source
# File lib/resque/plugins/job_history/job.rb, line 172
def stored_values
  @stored_values ||= redis.hgetall(job_key).with_indifferent_access
end