# -*- encoding: utf-8 -*- require 'active_support' module Bluepill class TriggerTimer < Coolio::TimerWatcher def initialize(trigger, event, delay) @trigger = trigger @event = event super(delay, false) end def on_timer begin @trigger.logger.info("Retrying from flapping") @trigger.dispatch!(@event) @trigger.remove_timer(self) rescue StandardError => e @trigger.logger.err(e) @trigger.logger.err(e.backtrace.join("\n")) end end end class Trigger @implementations = {} def self.inherited(klass) @implementations[klass.name.split('::').last.underscore.to_sym] = klass end def self.[](name) @implementations[name] end attr_accessor :process, :logger, :scheduled_events def initialize(process, options = {}) self.process = process self.logger = options[:logger] self.scheduled_events = [] end def reset! self.cancel_all_events end def notify(transition) raise "Implement in subclass" end def dispatch!(event) self.process.dispatch!(event, self.class.name.split("::").last) end def remove_timer(timer) self.scheduled_events.delete(timer) end def schedule_event(event, delay) timer = Bluepill::TriggerTimer.new(self, event, delay) self.scheduled_events << timer Bluepill::Event.attach(timer) end def cancel_all_events self.logger.info "Canceling all scheduled events" self.scheduled_events.each {|e| e.detach } self.scheduled_events.clear end end end