Skip to content

Instantly share code, notes, and snippets.

@tiewei
Created January 3, 2014 07:43
Show Gist options
  • Save tiewei/8234343 to your computer and use it in GitHub Desktop.
Save tiewei/8234343 to your computer and use it in GitHub Desktop.
A task timer based on rufus-scheduler, added logger and start/shutdown feature
require 'rufus-scheduler'
module Clipper
class TaskScheduler
def initialize(logger)
@scheduler = build_scheduler(logger)
@scheduled_tasks = []
@running = false
@logger = logger
end
def add_periodic_task(period_time, &block)
job = Rufus::Scheduler::IntervalJob.new(@scheduler, "#{period_time}s", {}, block)
@scheduled_tasks << job
@scheduler.start_job(job) if running?
end
def add_task(delay_time, &block)
job = Rufus::Scheduler::InJob.new(@scheduler, "#{delay_time}s", {}, block)
@scheduled_tasks << job
@scheduler.start_job(job) if running?
end
def start!
unless @running
@scheduled_tasks.each do |job|
@scheduler.start_job(job)
end
@logger.info("TaskScheduler started")
end
end
def running?
return @running
end
def shutdown
@logger.info("TaskScheduler starts shuting down")
@scheduler.shutdown
@logger.info("TaskScheduler has shut down")
end
private
def build_scheduler(logger)
unless logger.respond_to? :puts
logger.define_singleton_method(:puts){ |error| self.error(error) }
end
scheduler = Rufus::Scheduler.new
scheduler.define_singleton_method(:start_job) do |job|
if job.is_a? Rufus::Scheduler::InJob
#hacked into Rufus::Scheduler::InJob to reset its @next_time
in_time = job.next_time - job.scheduled_at
job.instance_variable_set(:@next_time,Time.now + in_time)
end
@jobs.push(job)
end
return scheduler
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment