class EventMachine::AlignedPeriodic

Constants

VERSION

Attributes

nextevent[R]

Public Class Methods

new(interval, p, offset = 0, logger = nil) click to toggle source
# File lib/eventmachine_alignedperiodic.rb, line 13
def initialize(interval, p, offset = 0, logger = nil)
    @interval = interval
    @offset = offset
    @p = p
    @logger = logger
    @partial = true
    @running = false
    @mutex = Mutex.new
end

Public Instance Methods

poke() click to toggle source
# File lib/eventmachine_alignedperiodic.rb, line 31
def poke
    @mutex.synchronize {
        # if we aren't running, we can't be poked
        unless @running
            raise "periodic schedulder not running; can't be poked"
        end
        EventMachine.cancel_timer(@timer)
        @p.call(true)
        @partial = true
        schedule_next_event
    }
end
start() click to toggle source
# File lib/eventmachine_alignedperiodic.rb, line 23
def start
    @mutex.synchronize {
        EventMachine.add_shutdown_hook { @p.call(true) }
        @running = true
        schedule_first_event
    }
end
stop() click to toggle source
# File lib/eventmachine_alignedperiodic.rb, line 44
def stop
    #Changed as per https://github.com/eventmachine/eventmachine/issues/418
    if EM.reactor_running?
      EM.add_timer(0) {
          EventMachine.cancel_timer(@timer) if !@timer.nil?
      }
    end
    @running = false
    @timer = nil
    @p.call(true)
end

Private Instance Methods

do_periodic() click to toggle source
# File lib/eventmachine_alignedperiodic.rb, line 58
def do_periodic
    @mutex.synchronize {
        # we can't remove shutdown hooks, so if we aren't running, do nothing
        return unless @running
        begin
            @p.call(@partial)
        rescue => e
            if ! @logger.nil?
                @logger.debug("exception in do_periodic: #{e}")
            end
        end
        @partial = false if @partial
        @lastevent = @nextevent
        schedule_next_event
    }
end
schedule() click to toggle source
# File lib/eventmachine_alignedperiodic.rb, line 92
def schedule
    if ! @logger.nil?
        @logger.debug("next event is at #{@nextevent}")
    end
    nextevent_in = @nextevent - Time.now
    @timer = EventMachine.add_timer(nextevent_in) { do_periodic() }
end
schedule_first_event() click to toggle source
# File lib/eventmachine_alignedperiodic.rb, line 75
def schedule_first_event
    now = Time.now
    if @lastevent.nil?
        @lastevent = now.to_date.to_time + @offset
        while @lastevent + @interval < now
            @lastevent += @interval
        end
    end
    @nextevent = @lastevent + @interval
    schedule
end
schedule_next_event() click to toggle source
# File lib/eventmachine_alignedperiodic.rb, line 87
def schedule_next_event
    @nextevent = @lastevent + @interval
    schedule
end