class Clockwork::Manager

Attributes

config[R]

Public Class Methods

new() click to toggle source
# File lib/clockwork/manager.rb, line 7
def initialize
  @events = []
  @callbacks = {}
  @config = default_configuration
  @handler = nil
end

Public Instance Methods

configure() { |config| ... } click to toggle source
# File lib/clockwork/manager.rb, line 18
def configure
  yield(config)
end
default_configuration() click to toggle source
# File lib/clockwork/manager.rb, line 22
def default_configuration
  { :sleep_timeout => 1, :logger => Logger.new(STDOUT), :thread => false, :max_threads => 10 }
end
error_handler(&block) click to toggle source
# File lib/clockwork/manager.rb, line 32
def error_handler(&block)
  @error_handler = block if block_given?
  @error_handler
end
every(period, job, options={}, &block) click to toggle source
# File lib/clockwork/manager.rb, line 42
def every(period, job, options={}, &block)
  if options[:at].respond_to?(:each)
    every_with_multiple_times(period, job, options, &block)
  else
    register(period, job, block, options)
  end
end
fire_callbacks(event, *args) click to toggle source
# File lib/clockwork/manager.rb, line 50
def fire_callbacks(event, *args)
  @callbacks[event].nil? || @callbacks[event].all? { |h| h.call(*args) }
end
handle_error(e) click to toggle source
# File lib/clockwork/manager.rb, line 80
def handle_error(e)
  error_handler.call(e) if error_handler
end
handler(&block) click to toggle source
# File lib/clockwork/manager.rb, line 26
def handler(&block)
  @handler = block if block_given?
  raise NoHandlerDefined unless @handler
  @handler
end
log(msg) click to toggle source
# File lib/clockwork/manager.rb, line 84
def log(msg)
  config[:logger].info(msg)
end
log_error(e) click to toggle source
# File lib/clockwork/manager.rb, line 76
def log_error(e)
  config[:logger].error(e)
end
on(event, options={}, &block) click to toggle source
# File lib/clockwork/manager.rb, line 37
def on(event, options={}, &block)
  raise "Unsupported callback #{event}" unless [:before_tick, :after_tick, :before_run, :after_run].include?(event.to_sym)
  (@callbacks[event.to_sym]||=[]) << block
end
run() click to toggle source
# File lib/clockwork/manager.rb, line 54
def run
  log "Starting clock for #{@events.size} events: [ #{@events.map(&:to_s).join(' ')} ]"
  loop do
    tick
    sleep(config[:sleep_timeout])
  end
end
thread_available?() click to toggle source
# File lib/clockwork/manager.rb, line 14
def thread_available?
  Thread.list.select { |t| t['creator'] == self }.count < config[:max_threads]
end
tick(t=Time.now) click to toggle source
# File lib/clockwork/manager.rb, line 62
def tick(t=Time.now)
  if (fire_callbacks(:before_tick))
    events = events_to_run(t)
    events.each do |event|
      if (fire_callbacks(:before_run, event, t))
        event.run(t)
        fire_callbacks(:after_run, event, t)
      end
    end
  end
  fire_callbacks(:after_tick)
  events
end

Private Instance Methods

events_to_run(t) click to toggle source
# File lib/clockwork/manager.rb, line 89
def events_to_run(t)
  @events.select{ |event| event.run_now?(t) }
end
every_with_multiple_times(period, job, options={}, &block) click to toggle source
# File lib/clockwork/manager.rb, line 99
def every_with_multiple_times(period, job, options={}, &block)
  each_options = options.clone
  options[:at].each do |at|
    each_options[:at] = at
    register(period, job, block, each_options)
  end
end
register(period, job, block, options) click to toggle source
# File lib/clockwork/manager.rb, line 93
def register(period, job, block, options)
  event = Event.new(self, period, job, block || handler, options)
  @events << event
  event
end