class Roundhouse::SortedEntry

Attributes

parent[R]
score[R]

Public Class Methods

new(parent, score, item) click to toggle source
Calls superclass method Roundhouse::Job::new
# File lib/roundhouse/api.rb, line 413
def initialize(parent, score, item)
  super(item)
  @score = score
  @parent = parent
end

Public Instance Methods

add_to_queue() click to toggle source
# File lib/roundhouse/api.rb, line 436
def add_to_queue
  remove_job do |message|
    msg = Roundhouse.load_json(message)
    Roundhouse::Client.push(msg)
  end
end
at() click to toggle source
# File lib/roundhouse/api.rb, line 419
def at
  Time.at(score).utc
end
delete() click to toggle source
# File lib/roundhouse/api.rb, line 423
def delete
  if @value
    @parent.delete_by_value(@parent.name, @value)
  else
    @parent.delete_by_jid(score, jid)
  end
end
kill() click to toggle source

Place job in the dead set

# File lib/roundhouse/api.rb, line 454
def kill
  raise 'Kill not available on jobs which have not failed' unless item['failed_at']
  remove_job do |message|
    Roundhouse.logger.info { "Killing job #{message['jid']}" }
    now = Time.now.to_f
    Roundhouse.redis do |conn|
      conn.multi do
        conn.zadd('dead', now, message)
        conn.zremrangebyscore('dead', '-inf', now - DeadSet.timeout)
        conn.zremrangebyrank('dead', 0, - DeadSet.max_jobs)
      end
    end
  end
end
reschedule(at) click to toggle source
# File lib/roundhouse/api.rb, line 431
def reschedule(at)
  delete
  @parent.schedule(at, item)
end
retry() click to toggle source
# File lib/roundhouse/api.rb, line 443
def retry
  raise "Retry not available on jobs which have not failed" unless item["failed_at"]
  remove_job do |message|
    msg = Roundhouse.load_json(message)
    msg['retry_count'] -= 1
    Roundhouse::Client.push(msg)
  end
end

Private Instance Methods

remove_job() { |first| ... } click to toggle source
# File lib/roundhouse/api.rb, line 471
def remove_job
  Roundhouse.redis do |conn|
    results = conn.multi do
      conn.zrangebyscore(parent.name, score, score)
      conn.zremrangebyscore(parent.name, score, score)
    end.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
      hash = results.group_by do |message|
        if message.index(jid)
          msg = Roundhouse.load_json(message)
          msg['jid'] == jid
        else
          false
        end
      end

      msg = hash.fetch(true, []).first
      yield msg if msg

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