Class: DaemonObjects::Base

Inherits:
Object
  • Object
show all
Extended by:
Logging
Defined in:
lib/daemon_objects/base.rb

Class Method Summary collapse

Methods included from Logging

create_logger, force_logger_reset, log_directory, log_filename, logger, logger=

Class Method Details

.after_forkObject



50
51
52
53
54
55
# File 'lib/daemon_objects/base.rb', line 50

def self.after_fork
  # daemonizing closes all file handles, so this will reopen the log
  force_logger_reset
  # this seems to be enough to initialize NewRelic if it's defined
  defined?(NewRelic)
end

.app_directoryObject



20
21
22
# File 'lib/daemon_objects/base.rb', line 20

def self.app_directory
  @app_directory ||= (defined? Rails) ? Rails.root : Rake.original_dir
end

.consumer_classObject



28
29
30
# File 'lib/daemon_objects/base.rb', line 28

def self.consumer_class
  @consumer_class ||= "#{self.to_s.gsub("Daemon", "")}Consumer".constantize
end

.consumes_amqp(opts = {}) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/daemon_objects/base.rb', line 6

def self.consumes_amqp(opts={})
  extend DaemonObjects::AmqpSupport
  self.endpoint                   = opts.delete(:endpoint)
  self.queue                      = opts.delete(:queue_name)
  self.arguments["x-message-ttl"] = opts.delete(:ttl) if opts[:ttl]
  self.prefetch                   = opts.delete(:prefetch)
  self.retry_wait_time            = opts.delete(:retry_wait_time)
  self.worker_class               = opts.delete(:worker_class) || DaemonObjects::Amqp::Worker
  self.arguments.merge!(opts)

  logger.info "Configured to consume queue [#{queue}] at endpoint [#{endpoint}]"
  logger.info "Worker class is '#{worker_class}'"
end

.get_consumerObject



36
37
38
39
40
# File 'lib/daemon_objects/base.rb', line 36

def self.get_consumer
  consumer_class.new(:logger        => logger,
                     :app_directory => app_directory,
                     :environment   => DaemonObjects.environment)
end

.handle_error(e) ⇒ Object



86
87
88
89
90
# File 'lib/daemon_objects/base.rb', line 86

def self.handle_error(e)
  logger.error(e.message)
  logger.error(e.backtrace.join("\n"))
  Airbrake.notify(e) if defined?(Airbrake)
end

.pid_directoryObject



24
25
26
# File 'lib/daemon_objects/base.rb', line 24

def self.pid_directory
  File.join(app_directory, "tmp/pids")
end

.proc_nameObject



32
33
34
# File 'lib/daemon_objects/base.rb', line 32

def self.proc_name
  @proc_name ||= self.to_s.underscore
end

.restartObject



81
82
83
84
# File 'lib/daemon_objects/base.rb', line 81

def self.restart
  start
  stop
end

.runObject



42
43
44
45
46
47
48
# File 'lib/daemon_objects/base.rb', line 42

def self.run
  begin
    get_consumer.run
  rescue StandardError => e
    handle_error(e)
  end
end

.startObject



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/daemon_objects/base.rb', line 57

def self.start
  # connection will get severed on fork, so disconnect first
  ActiveRecord::Base.connection.disconnect! if defined?(ActiveRecord::Base)

  FileUtils.mkdir_p(pid_directory)

  Daemons.run_proc(proc_name,
                  { :ARGV       => ["start", "-f"],
                    :log_dir    => "/tmp",
                    :dir        => pid_directory,
                    :log_output => true}) do

    after_fork
    run
  end

rescue StandardError => e
  handle_error(e)
end

.stopObject



77
78
79
# File 'lib/daemon_objects/base.rb', line 77

def self.stop
  Daemons.run_proc(proc_name, { :ARGV => [ "stop", "-f" ], :dir => pid_directory})
end