Class: CarrotRpc::ServerRunner

Inherits:
Object
  • Object
show all
Extended by:
ActiveSupport::Autoload
Defined in:
lib/carrot_rpc/server_runner.rb

Overview

Automatically detects, loads, and runs all RpcServer subclasses under ‘app/servers` in the project root.

Defined Under Namespace

Modules: AutoloadRails, Logger, Signals Classes: Pid, Signal

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(rails_path: ".", pidfile: nil, daemonize: false) ⇒ ServerRunner

Instantiate the ServerRunner.



24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/carrot_rpc/server_runner.rb', line 24

def initialize(rails_path: ".", pidfile: nil, daemonize: false)
  self.signal = CarrotRpc::ServerRunner::Signal.new

  @daemonize = daemonize
  @servers = []

  CarrotRpc::ServerRunner::AutoloadRails.conditionally_load_root(rails_path, logger: logger)

  @pid = CarrotRpc::ServerRunner::Pid.new(
    path:   pidfile,
    logger: logger
  )
end

Instance Attribute Details

#pidCarrotRpc::ServerRunner::Pid (readonly)



19
20
21
# File 'lib/carrot_rpc/server_runner.rb', line 19

def pid
  @pid
end

#serversObject (readonly)

Attributes



15
16
17
# File 'lib/carrot_rpc/server_runner.rb', line 15

def servers
  @servers
end

#signalObject

Attributes



15
16
17
# File 'lib/carrot_rpc/server_runner.rb', line 15

def signal
  @signal
end

Instance Method Details

#daemonizeObject

Background the ruby process.



120
121
122
123
124
125
# File 'lib/carrot_rpc/server_runner.rb', line 120

def daemonize
  exit if fork
  Process.setsid
  exit if fork
  Dir.chdir "/"
end

#daemonize?Boolean

Attribute to determine when to daemonize the process.

Returns:

  • (Boolean)


113
114
115
# File 'lib/carrot_rpc/server_runner.rb', line 113

def daemonize?
  @daemonize
end

#loggerObject

Convenience method to wrap the logger object.



105
106
107
# File 'lib/carrot_rpc/server_runner.rb', line 105

def logger
  @logger ||= set_logger
end

#run!Object

Start the servers and the run loop.



39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/carrot_rpc/server_runner.rb', line 39

def run!
  CarrotRpc.connect

  signal.trap

  pid.check
  daemonize && suppress_output if daemonize?
  pid.ensure_written

  # Initialize the servers. Set logger.
  run_servers
  stop_servers(signal.wait)
end

#run_server_file(file) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/carrot_rpc/server_runner.rb', line 79

def run_server_file(file)
  require file
  server_klass_name = file.to_s.split("/").last.gsub(".rb", "").camelize
  server_klass = server_klass_name.constantize

  stm = CarrotRpc.configuration.server_test_mode
  logger.info "Starting: #{server_klass} | Rails/Rack ENV: #{ENV['RAILS_ENV']} | Server Test Mode: #{stm}"

  server = server_klass.new(block: false)
  server.start

  server
end

#run_servers(dirs: %w(app servers)) ⇒ Array

Find and require all servers in the app/servers dir.

Parameters:

  • dirs (Array) (defaults to: %w(app servers))

    directories relative to root of host application where RpcServers can be loaded

Returns:

  • (Array)

    of RpcServers loaded and initialized



67
68
69
70
71
72
73
74
75
76
77
# File 'lib/carrot_rpc/server_runner.rb', line 67

def run_servers(dirs: %w(app servers))
  files = server_files(dirs)
  fail "No servers found!" if files.empty?

  # Load each server defined in the project dir
  files.each do |file|
    @servers << run_server_file(file)
  end

  @servers
end

#server_files(dirs) ⇒ Object



93
94
95
# File 'lib/carrot_rpc/server_runner.rb', line 93

def server_files(dirs)
  Dir[server_glob(dirs)]
end

#server_glob(dirs) ⇒ Object



97
98
99
100
101
102
# File 'lib/carrot_rpc/server_runner.rb', line 97

def server_glob(dirs)
  regex = %r{\A/.*/#{dirs.join("/")}\z}
  $LOAD_PATH.find { |p|
    p.match(regex)
  } + "/*.rb"
end

#stop_servers(signal_name) ⇒ Object

Shutdown all servers defined.



54
55
56
57
58
59
60
61
62
# File 'lib/carrot_rpc/server_runner.rb', line 54

def stop_servers(signal_name)
  logger.info "#{signal_name} signal received!"
  @servers.each do |s|
    logger.info "Shutting Down Server Queue: #{s.server_queue.name}"
    s.channel.close
  end
  # Close the connection once all the other servers are shutdown
  CarrotRpc.configuration.bunny.close
end

#suppress_outputObject

Part of daemonizing process. Prevents application from outputting info to terminal.



128
129
130
131
# File 'lib/carrot_rpc/server_runner.rb', line 128

def suppress_output
  $stderr.reopen("/dev/null", "a")
  $stdout.reopen($stderr)
end