class Sidekiq::SortedEntry

Attributes

parent[R]
score[R]

Public Class Methods

new(parent, score, item) click to toggle source
Calls superclass method Sidekiq::JobRecord::new
# File lib/sidekiq/api.rb, line 465
def initialize(parent, score, item)
  super(item)
  @score = score
  @parent = parent
end

Public Instance Methods

add_to_queue() click to toggle source
# File lib/sidekiq/api.rb, line 489
def add_to_queue
  remove_job do |message|
    msg = Sidekiq.load_json(message)
    Sidekiq::Client.push(msg)
  end
end
at() click to toggle source
# File lib/sidekiq/api.rb, line 471
def at
  Time.at(score).utc
end
delete() click to toggle source
# File lib/sidekiq/api.rb, line 475
def delete
  if @value
    @parent.delete_by_value(@parent.name, @value)
  else
    @parent.delete_by_jid(score, jid)
  end
end
error?() click to toggle source
# File lib/sidekiq/api.rb, line 512
def error?
  !!item["error_class"]
end
kill() click to toggle source

Place job in the dead set

# File lib/sidekiq/api.rb, line 506
def kill
  remove_job do |message|
    DeadSet.new.kill(message)
  end
end
reschedule(at) click to toggle source
# File lib/sidekiq/api.rb, line 483
def reschedule(at)
  Sidekiq.redis do |conn|
    conn.zincrby(@parent.name, at.to_f - @score, Sidekiq.dump_json(@item))
  end
end
retry() click to toggle source
# File lib/sidekiq/api.rb, line 496
def retry
  remove_job do |message|
    msg = Sidekiq.load_json(message)
    msg["retry_count"] -= 1 if msg["retry_count"]
    Sidekiq::Client.push(msg)
  end
end

Private Instance Methods

remove_job() { |first| ... } click to toggle source
# File lib/sidekiq/api.rb, line 518
def remove_job
  Sidekiq.redis do |conn|
    results = conn.multi {
      conn.zrangebyscore(parent.name, score, score)
      conn.zremrangebyscore(parent.name, score, score)
    }.first

    if results.size == 1
      yield results.first
    else
      # multiple jobs with the same score
      # find the one with the right JID and push it
      matched, nonmatched = results.partition { |message|
        if message.index(jid)
          msg = Sidekiq.load_json(message)
          msg["jid"] == jid
        else
          false
        end
      }

      msg = matched.first
      yield msg if msg

      # push the rest back onto the sorted set
      conn.multi do
        nonmatched.each do |message|
          conn.zadd(parent.name, score.to_f.to_s, message)
        end
      end
    end
  end
end