class Jober::AbstractTask

Attributes

short_name[RW]
finished[R]
stopped[R]
unique_id[R]
worker_id[R]
workers_count[R]

Public Class Methods

get_interval() click to toggle source
# File lib/jober/abstract_task.rb, line 12
def get_interval
  @interval || Jober.default_interval
end
get_workers() click to toggle source
# File lib/jober/abstract_task.rb, line 20
def get_workers
  @workers || 1
end
inherited(base) click to toggle source
# File lib/jober/abstract_task.rb, line 37
def self.inherited(base)
  Jober.add_class(base)
  base.interval(self.get_interval)
end
interval(interval) click to toggle source
# File lib/jober/abstract_task.rb, line 8
def interval(interval)
  @interval = interval
end
manual!() click to toggle source
# File lib/jober/abstract_task.rb, line 24
def manual!
  @manual = true
end
manual?() click to toggle source
# File lib/jober/abstract_task.rb, line 28
def manual?
  @manual
end
new(opts = {}) click to toggle source

opts:

:worker_id
:workers_count
:skip_delay
# File lib/jober/abstract_task.rb, line 46
def initialize(opts = {})
  @opts = opts
  @stopped = false
  trap("QUIT") { @stopped = true }
  trap("INT")  { @stopped = true }
  @worker_id = (opts[:worker_id] || 0).to_i
  @workers_count = (opts[:workers_count] || 1).to_i
  @skip_delay = opts[:skip_delay]
  @unique_id = opts[:unique_id]
  after_initialize
end
workers(n) click to toggle source
# File lib/jober/abstract_task.rb, line 16
def workers(n)
  @workers = n
end

Private Class Methods

del_timestamp(type) click to toggle source
# File lib/jober/abstract_task.rb, line 171
def self.del_timestamp(type)
  Jober.catch do
    Jober.redis.del(timestamp_key(type))
  end
end
pop_skip_delay_flag!() click to toggle source
# File lib/jober/abstract_task.rb, line 144
def self.pop_skip_delay_flag!
  Jober.catch do
    res = Jober.redis.get(timestamp_key(:skip))
    Jober.redis.del(timestamp_key(:skip)) if res
    !!res
  end
end
read_timestamp(type) click to toggle source
# File lib/jober/abstract_task.rb, line 158
def self.read_timestamp(type)
  Jober.catch do
    res = Jober.redis.get(timestamp_key(type))
    Time.at(res.to_i) if res
  end
end
skip_delay!() click to toggle source
# File lib/jober/abstract_task.rb, line 152
def self.skip_delay!
  Jober.catch do
    Jober.redis.set(timestamp_key(:skip), '1')
  end
end
stats() click to toggle source
# File lib/jober/abstract_task.rb, line 194
def self.stats
  Jober.stats[self.short_name]
end
timestamp_key(type) click to toggle source
# File lib/jober/abstract_task.rb, line 140
def self.timestamp_key(type)
  Jober.key("stats:#{short_name}:#{type}")
end
write_timestamp(type) click to toggle source
# File lib/jober/abstract_task.rb, line 165
def self.write_timestamp(type)
  Jober.catch do
    Jober.redis.set(timestamp_key(type), Time.now.to_i.to_s)
  end
end

Public Instance Methods

after_execute() click to toggle source
# File lib/jober/abstract_task.rb, line 89
def after_execute
  nil
end
after_initialize() click to toggle source
# File lib/jober/abstract_task.rb, line 58
def after_initialize
end
before_execute() click to toggle source
# File lib/jober/abstract_task.rb, line 61
def before_execute
  nil
end
execute() click to toggle source
# File lib/jober/abstract_task.rb, line 65
def execute
  info "=> start"
  before_execute
  @start_at = Time.now
  @finished = false
  self.class.write_timestamp(:started)
  run
  self.class.del_timestamp(:crashed)
  if @stopped
    self.class.write_timestamp(:stopped)
  else
    self.class.write_timestamp(:finished)
    self.class.del_timestamp(:stopped)
  end
  info "<= end (in #{Time.now - @start_at})"
  @finished = true
  after_execute
  self
rescue Object
  self.class.write_timestamp(:crashed)
  on_crashed
  raise
end
on_crashed() click to toggle source
# File lib/jober/abstract_task.rb, line 93
def on_crashed
  nil
end
run_loop() click to toggle source
# File lib/jober/abstract_task.rb, line 97
def run_loop
  info { "running loop" }

  # wait until interval + last end
  if self.class.get_workers <= 1 &&
      (finished = self.class.read_timestamp(:finished)) &&
      (Time.now - finished < self.class.get_interval) &&
      !self.class.pop_skip_delay_flag! &&
      !@skip_delay &&
      !self.class.read_timestamp(:stopped)

    sleeping(self.class.get_interval - (Time.now - finished))
  end

  # main loop
  loop do
    break if stopped
    execute
    break if stopped
    sleeping
    break if stopped
  end

  info { "quit loop" }
end
sleeping(int = self.class.get_interval) click to toggle source
# File lib/jober/abstract_task.rb, line 123
def sleeping(int = self.class.get_interval)
  info { "sleeping for %.1fm ..." % [int / 60.0] }
  Timeout.timeout(int.to_f) do
    loop do
      sleep 0.3
      return if stopped
    end
  end
rescue Timeout::Error
end
stop!() click to toggle source
# File lib/jober/abstract_task.rb, line 134
def stop!
  @stopped = true
end

Private Instance Methods

get_store(name) click to toggle source
# File lib/jober/abstract_task.rb, line 187
def get_store(name)
  self.catch do
    r = Jober.redis.get(store_key(name))
    Jober.load(r) if r
  end
end
set_store(name, obj) click to toggle source
# File lib/jober/abstract_task.rb, line 181
def set_store(name, obj)
  self.catch do
    Jober.redis.set(store_key(name), Jober.dump(obj))
  end
end
store_key(name) click to toggle source
# File lib/jober/abstract_task.rb, line 177
def store_key(name)
  Jober.key("store:#{self.class.short_name}-#{self.worker_id}-#{self.workers_count}:#{name}")
end