class Sidekiq::JobRecord

Encapsulates a pending job within a Sidekiq queue or sorted set.

The job should be considered immutable but may be removed from the queue via JobRecord#delete.

Attributes

item[R]
queue[R]
value[R]

Public Class Methods

new(item, queue_name = nil) click to toggle source
# File lib/sidekiq/api.rb, line 308
def initialize(item, queue_name = nil)
  @args = nil
  @value = item
  @item = item.is_a?(Hash) ? item : parse(item)
  @queue = queue_name || @item["queue"]
end

Public Instance Methods

[](name) click to toggle source
# File lib/sidekiq/api.rb, line 425
def [](name)
  # nil will happen if the JSON fails to parse.
  # We don't guarantee Sidekiq will work with bad job JSON but we should
  # make a best effort to minimize the damage.
  @item ? @item[name] : nil
end
args() click to toggle source
# File lib/sidekiq/api.rb, line 379
def args
  @args || @item["args"]
end
created_at() click to toggle source
# File lib/sidekiq/api.rb, line 391
def created_at
  Time.at(self["created_at"] || self["enqueued_at"] || 0).utc
end
delete() click to toggle source

Remove this job from the queue.

# File lib/sidekiq/api.rb, line 418
def delete
  count = Sidekiq.redis { |conn|
    conn.lrem("queue:#{@queue}", 1, @value)
  }
  count != 0
end
display_args() click to toggle source
# File lib/sidekiq/api.rb, line 352
def display_args
  # Unwrap known wrappers so they show up in a human-friendly manner in the Web UI
  @display_args ||= case klass
            when /\ASidekiq::Extensions::Delayed/
              safe_load(args[0], args) do |_, _, arg|
                arg
              end
            when "ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper"
              job_args = self["wrapped"] ? args[0]["arguments"] : []
              if (self["wrapped"] || args[0]) == "ActionMailer::DeliveryJob"
                # remove MailerClass, mailer_method and 'deliver_now'
                job_args.drop(3)
              elsif (self["wrapped"] || args[0]) == "ActionMailer::MailDeliveryJob"
                # remove MailerClass, mailer_method and 'deliver_now'
                job_args.drop(3).first["args"]
              else
                job_args
              end
            else
              if self["encrypt"]
                # no point in showing 150+ bytes of random garbage
                args[-1] = "[encrypted data]"
              end
              args
  end
end
display_class() click to toggle source
# File lib/sidekiq/api.rb, line 330
def display_class
  # Unwrap known wrappers so they show up in a human-friendly manner in the Web UI
  @klass ||= self["display_class"] || begin
    case klass
    when /\ASidekiq::Extensions::Delayed/
      safe_load(args[0], klass) do |target, method, _|
        "#{target}.#{method}"
      end
    when "ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper"
      job_class = @item["wrapped"] || args[0]
      if job_class == "ActionMailer::DeliveryJob" || job_class == "ActionMailer::MailDeliveryJob"
        # MailerClass#mailer_method
        args[0]["arguments"][0..1].join("#")
      else
        job_class
      end
    else
      klass
    end
  end
end
enqueued_at() click to toggle source
# File lib/sidekiq/api.rb, line 387
def enqueued_at
  self["enqueued_at"] ? Time.at(self["enqueued_at"]).utc : nil
end
error_backtrace() click to toggle source
# File lib/sidekiq/api.rb, line 399
def error_backtrace
  # Cache nil values
  if defined?(@error_backtrace)
    @error_backtrace
  else
    value = self["error_backtrace"]
    @error_backtrace = value && uncompress_backtrace(value)
  end
end
jid() click to toggle source
# File lib/sidekiq/api.rb, line 383
def jid
  self["jid"]
end
klass() click to toggle source
# File lib/sidekiq/api.rb, line 326
def klass
  self["class"]
end
latency() click to toggle source
# File lib/sidekiq/api.rb, line 411
def latency
  now = Time.now.to_f
  now - (@item["enqueued_at"] || @item["created_at"] || now)
end
parse(item) click to toggle source
# File lib/sidekiq/api.rb, line 315
def parse(item)
  Sidekiq.load_json(item)
rescue JSON::ParserError
  # If the job payload in Redis is invalid JSON, we'll load
  # the item as an empty hash and store the invalid JSON as
  # the job 'args' for display in the Web UI.
  @invalid = true
  @args = [item]
  {}
end
tags() click to toggle source
# File lib/sidekiq/api.rb, line 395
def tags
  self["tags"] || []
end

Private Instance Methods

safe_load(content, default) { |*load| ... } click to toggle source
# File lib/sidekiq/api.rb, line 434
def safe_load(content, default)
  yield(*YAML.load(content))
rescue => ex
  # #1761 in dev mode, it's possible to have jobs enqueued which haven't been loaded into
  # memory yet so the YAML can't be loaded.
  Sidekiq.logger.warn "Unable to load YAML: #{ex.message}" unless Sidekiq.options[:environment] == "development"
  default
end
uncompress_backtrace(backtrace) click to toggle source
# File lib/sidekiq/api.rb, line 443
def uncompress_backtrace(backtrace)
  if backtrace.is_a?(Array)
    # Handle old jobs with raw Array backtrace format
    backtrace
  else
    decoded = Base64.decode64(backtrace)
    uncompressed = Zlib::Inflate.inflate(decoded)
    begin
      Sidekiq.load_json(uncompressed)
    rescue
      # Handle old jobs with marshalled backtrace format
      # TODO Remove in 7.x
      Marshal.load(uncompressed)
    end
  end
end