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