Sha256: 110d0e58fe09d0b91a347a09756bcc55db283e2231a24a6efa79b18d111b453c

Contents?: true

Size: 1.89 KB

Versions: 1

Compression:

Stored size: 1.89 KB

Contents

require File.expand_path(File.join(File.dirname(__FILE__), 'publisher'))
require 'singleton'

module Dboard
  class Collector
    include Singleton

    attr_reader :sources

    def self.register_source(key, instance)
      Collector.instance.register_source(key, instance)
    end

    def self.register_after_update_callback(callback)
      Collector.instance.register_after_update_callback(callback)
    end

    def self.start
      instance.start
    end

    def initialize
      @sources = {}
      @after_update_callback = lambda {}
    end

    def start
      @sources.each do |source, instance|
        Thread.new do
          loop do
            update_in_thread
          end
        end
      end
      loop { sleep 1 }
    end

    def update_in_thread
      time = Time.now
      puts "#{source} updating..."
      update_source(source, instance)
      elapsed_time = Time.now - time
      time_until_next_update = instance.update_interval - elapsed_time
      time_until_next_update = 0 if time_until_next_update < 0
      puts "#{source} done in #{elapsed_time} seconds, will update again in #{time_until_next_update} seconds (interval: #{instance.update_interval})."
      sleep time_until_next_update
    rescue Exception => ex
      puts "Something failed outside the update_source method. #{ex.message}"
      puts ex.backtrace
    end

    def update_source(source, instance)
      begin
        data = instance.fetch
        publish_data(source, data)
      ensure
        @after_update_callback.call
      end
    rescue Exception => ex
      puts "Failed to update #{source}: #{ex.message}"
      puts ex.backtrace
    end

    def register_source(key, instance)
      @sources.merge!({ key => instance })
    end

    def register_after_update_callback(callback)
      @after_update_callback = callback
    end

    def publish_data(source, data)
      Publisher.publish(source, data)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dboard-1.0.0 lib/collector.rb