class HydroponicBean::Job

Attributes

created_at[RW]
data[RW]
delay[RW]
id[RW]
pri[RW]
reserved_at[RW]
reserved_by[RW]
state[RW]
stats[RW]
ttr[RW]
tube[RW]

Public Class Methods

new(tube, pri, delay, ttr, data) click to toggle source
# File lib/hydroponic_bean/job.rb, line 10
def initialize(tube, pri, delay, ttr, data)
  @id = self.class.next_id
  @created_at = Time.now.utc
  @tube = tube
  @pri = pri.to_i
  @delay = delay.to_i
  @reserved_at = nil
  @ttr = ttr.to_i
  @state = @delay > 0 ? State.delayed : State.ready
  @data = data
  @deleted = false
  @stats = {
    'reserves' => 0,
    'timeouts' => 0,
    'releases' => 0,
    'buries' => 0,
    'kicks' => 0,
  }

  @tube.push(self)
end
next_id() click to toggle source
# File lib/hydroponic_bean/job.rb, line 3
def self.next_id
  HydroponicBean.jobs.length + 1
end

Public Instance Methods

age() click to toggle source
# File lib/hydroponic_bean/job.rb, line 41
def age
  (Time.now.utc - created_at).to_i
end
buried?() click to toggle source
# File lib/hydroponic_bean/job.rb, line 53
def buried?;   exists? && state == State.buried; end
bury(connection, pri) click to toggle source
# File lib/hydroponic_bean/job.rb, line 81
def bury(connection, pri)
  if reserved_by?(connection)
    stats['buries'] += 1
    @pri = pri.to_i
    @reserved_at = nil
    @reserved_by = nil
    @state = State.buried
  end
end
deadline_soon?() click to toggle source
# File lib/hydroponic_bean/job.rb, line 119
def deadline_soon?
  ttr_left <= 1
end
delayed?() click to toggle source
# File lib/hydroponic_bean/job.rb, line 52
def delayed?;  exists? && state == State.delayed; end
delete(connection) click to toggle source
# File lib/hydroponic_bean/job.rb, line 91
def delete(connection)
  if exists? && (!reserved? || reserved_by?(connection))
    @tube.job_deleted!
    @deleted = true
  end
end
deleted?() click to toggle source
# File lib/hydroponic_bean/job.rb, line 137
def deleted?; @deleted; end
exists?() click to toggle source
# File lib/hydroponic_bean/job.rb, line 138
def exists?; !@deleted; end
kick() click to toggle source
# File lib/hydroponic_bean/job.rb, line 104
def kick
  if buried? || delayed?
    stats['kicks'] += 1
    @state = State.ready
  end
end
ready?() click to toggle source
# File lib/hydroponic_bean/job.rb, line 50
def ready?;    exists? && state == State.ready; end
release(connection, pri, delay) click to toggle source
# File lib/hydroponic_bean/job.rb, line 70
def release(connection, pri, delay)
  if reserved_by?(connection)
    stats['releases'] += 1
    @pri = pri.to_i
    @delay = delay.to_i
    @reserved_at = nil
    @reserved_by = nil
    @state = @delay > 0 ? State.delayed : State.ready
  end
end
reserve(connection) click to toggle source
# File lib/hydroponic_bean/job.rb, line 59
def reserve(connection)
  if ready?
    stats['reserves'] += 1
    @state = State.reserved
    @reserved_by = connection
    @reserved_at = Time.now.utc
    # For convenience and one-liners
    return self
  end
end
reserved?() click to toggle source
# File lib/hydroponic_bean/job.rb, line 51
def reserved?; exists? && state == State.reserved; end
reserved_by?(connection) click to toggle source
# File lib/hydroponic_bean/job.rb, line 55
def reserved_by?(connection)
  reserved? && reserved_by == connection
end
serialize_stats() click to toggle source
# File lib/hydroponic_bean/job.rb, line 123
def serialize_stats
  {
    'id' => id,
    'tube' => tube.name,
    'state' => state.to_s,
    'pri' => pri,
    'age' => age,
    'delay' => delay,
    'ttr' => ttr,
    'time-left' => time_left,
    'file' => 0,
  }.merge(stats)
end
time_left() click to toggle source
# File lib/hydroponic_bean/job.rb, line 115
def time_left
  reserved? ? ttr_left : [delay - age, 0].max
end
touch(connection) click to toggle source
# File lib/hydroponic_bean/job.rb, line 98
def touch(connection)
  if reserved_by?(connection)
    @reserved_at = Time.now.utc
  end
end
ttr_left() click to toggle source
# File lib/hydroponic_bean/job.rb, line 111
def ttr_left
  [ttr - (Time.now.utc - reserved_at).to_i, 0].max
end
tube_name() click to toggle source
# File lib/hydroponic_bean/job.rb, line 45
def tube_name
  @tube.name
end
update_time!() click to toggle source
# File lib/hydroponic_bean/job.rb, line 32
def update_time!
  if (delayed? || reserved?) && time_left == 0
    if reserved?
      stats['timeouts'] += 1
    end
    @state = State.ready
  end
end
urgent?() click to toggle source
# File lib/hydroponic_bean/job.rb, line 49
def urgent?;   exists? && pri <= 1024; end