class Invoker::Commander

Attributes

event_manager[RW]
process_manager[RW]
reactor[RW]
runnables[RW]
thread_group[RW]

Public Class Methods

new() click to toggle source
# File lib/invoker/commander.rb, line 19
def initialize
  @thread_group = ThreadGroup.new
  @runnable_mutex = Mutex.new

  @event_manager = Invoker::Event::Manager.new
  @runnables = []

  @reactor = Invoker::Reactor.new
  @process_manager = Invoker::ProcessManager.new
  Thread.abort_on_exception = true
end

Public Instance Methods

on_next_tick(*args, &block) click to toggle source
# File lib/invoker/commander.rb, line 49
def on_next_tick(*args, &block)
  @runnable_mutex.synchronize do
    @runnables << OpenStruct.new(:args => args, :block => block)
  end
end
run_runnables() click to toggle source
# File lib/invoker/commander.rb, line 55
def run_runnables
  @runnables.each do |runnable|
    instance_exec(*runnable.args, &runnable.block)
  end
  @runnables = []
end
start_manager() click to toggle source

Start the invoker process supervisor. This method starts a unix server in separate thread that listens for incoming commands.

# File lib/invoker/commander.rb, line 33
def start_manager
  verify_process_configuration
  daemonize_app if Invoker.daemonize?
  install_interrupt_handler
  unix_server_thread = Thread.new { Invoker::IPC::Server.new }
  @thread_group.add(unix_server_thread)
  process_manager.run_power_server
  Invoker.config.autorunnable_processes.each do |process_info|
    process_manager.start_process(process_info)
    Logger.puts("Starting process - #{process_info.label} waiting for #{process_info.sleep_duration} seconds...")
    sleep(process_info.sleep_duration)
  end
  at_exit { process_manager.kill_workers }
  start_event_loop
end

Private Instance Methods

daemonize_app() click to toggle source
# File lib/invoker/commander.rb, line 91
def daemonize_app
  Invoker.daemon.start
end
install_interrupt_handler() click to toggle source
# File lib/invoker/commander.rb, line 84
def install_interrupt_handler
  Signal.trap("INT") do
    process_manager.kill_workers
    exit(0)
  end
end
run_scheduled_events() click to toggle source
# File lib/invoker/commander.rb, line 78
def run_scheduled_events
  event_manager.run_scheduled_events do |event|
    event.block.call
  end
end
start_event_loop() click to toggle source
# File lib/invoker/commander.rb, line 70
def start_event_loop
  loop do
    reactor.monitor_for_fd_events
    run_runnables
    run_scheduled_events
  end
end
verify_process_configuration() click to toggle source
# File lib/invoker/commander.rb, line 64
def verify_process_configuration
  if !Invoker.config.processes || Invoker.config.processes.empty?
    raise Invoker::Errors::InvalidConfig.new("No processes configured in config file")
  end
end