houston/houston-core

View on GitHub
lib/houston/boot/daemonize.rb

Summary

Maintainability
A
2 hrs
Test Coverage
module Houston

  def self.daemonize(name)
    unless Houston.running_as_web_server? or ENV["HOUSTON_DAEMONS"].to_s.split(",").member?(name)
      puts "\e[94m[daemon:#{name}] Skipping daemon since we're not running as a server\e[0m" if Rails.env.development?
      Rails.logger.info "\e[94m[daemon:#{name}] Skipping daemon since we're not running as a server\e[0m"
      return
    end

    puts "\e[94m[daemon:#{name}] Connecting\e[0m" if Rails.env.development?
    Rails.logger.info "\e[94m[daemon:#{name}] Connecting\e[0m"
    Thread.new do
      begin
        connected_at = Time.now
        Houston.observer.fire "daemon:#{name}:start"
        yield

      rescue Exception
        puts "\e[91m#{$!.class}: #{$!.message}\e[0m" if Rails.env.development?
        Houston.report_exception $!
        unless (Time.now - connected_at) < 60
          Houston.observer.fire "daemon:#{name}:restart"
          retry
        end
      end

      # This should never happen
      puts "\e[31m[daemon:#{name}] Disconnected\e[0m" if Rails.env.development?
      Rails.logger.error "\e[31m[daemon:#{name}] Disconnected\e[0m"

      # http://stackoverflow.com/a/3516003/731300
      Rails.logger.flush
      Houston.observer.fire "daemon:#{name}:stop"
    end
  end

end